*/
package org.opendaylight.openflowplugin.impl.rpc;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterators;
+import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
+import java.util.Set;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProviderFactory;
-import org.opendaylight.openflowplugin.impl.services.sal.FlowCapableTransactionServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.NodeConfigServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.PacketProcessingServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalAsyncConfigServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalBundleServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalEchoServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalExperimenterMessageServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalExperimenterMpMessageServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalFlatBatchServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalFlowServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalFlowsBatchServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalGroupServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalMeterServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalPortServiceImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalTableServiceImpl;
-import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightFlowStatisticsServiceImpl;
-import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightFlowTableStatisticsServiceImpl;
-import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightGroupStatisticsServiceImpl;
-import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightMeterStatisticsServiceImpl;
-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.OpendaylightDirectStatisticsServiceImpl;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiLayerDirectStatisticsProviderInitializer;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleLayerDirectStatisticsProviderInitializer;
+import org.opendaylight.openflowplugin.impl.services.SendEchoImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddBundleMessagesImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddFlowImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddFlowsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddGroupImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddGroupsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddMeterImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.AddMetersBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.ControlBundleImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.ProcessFlatBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveFlowImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveFlowsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveGroupImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveGroupsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveMeterImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.RemoveMetersBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.SendBarrierImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.SendExperimenterImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.SendExperimenterMpRequestImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.SetConfigImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.TransmitPacketImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateFlowImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateFlowsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateGroupImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateGroupsBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateMeterImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateMetersBatchImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdatePortImpl;
+import org.opendaylight.openflowplugin.impl.services.sal.UpdateTableImpl;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.GetAsyncImpl;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SetAsyncImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllGroupStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllMeterConfigStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllMeterStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllNodeConnectorsStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllQueuesStatisticsFromAllPortsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetAllQueuesStatisticsFromGivenPortImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetFlowTablesStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetGroupDescriptionImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetGroupFeaturesImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetGroupStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetMeterFeaturesImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetMeterStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetNodeConnectorStatisticsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.GetQueueStatisticsFromGivenPortImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.GetAllFlowStatisticsFromFlowTableImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.GetAllFlowsStatisticsFromAllFlowTablesImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.GetFlowStatisticsFromFlowTableImpl;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiGetFlowStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiGetGroupStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiGetMeterStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiGetNodeConnectorStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.multilayer.MultiGetQueueStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleGetFlowStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleGetGroupStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleGetMeterStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleGetNodeConnectorStatistics;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer.SingleGetQueueStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SalAsyncConfigService;
-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.experimenter.mp.message.service.rev151020.SalExperimenterMpMessageService;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsync;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsync;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEcho;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequest;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlows;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescription;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.NodeConfigService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.SalPortService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessages;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundle;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPorts;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTable;
+import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.yangtools.yang.binding.Rpc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final MessageSpy messageSpy;
private final Semaphore tracker;
private final boolean isStatisticsRpcEnabled;
-
- // TODO: add private Sal salBroker
- private final ConcurrentMap<Class<?>, ObjectRegistration<? extends RpcService>> rpcRegistrations =
- new ConcurrentHashMap<>();
private final KeyedInstanceIdentifier<Node, NodeKey> nodeInstanceIdentifier;
private final DeviceInfo deviceInfo;
private final DeviceContext deviceContext;
private final NotificationPublishService notificationPublishService;
private ContextChainMastershipWatcher contextChainMastershipWatcher = null;
+ private Registration rpcRegistration;
RpcContextImpl(@NonNull final RpcProviderService rpcProviderRegistry,
final int maxRequests,
tracker = new Semaphore(maxRequests, true);
}
- private <S extends RpcService> void registerRpcServiceImplementation(final Class<S> serviceClass,
- final S serviceInstance) {
- if (!rpcRegistrations.containsKey(serviceClass)) {
- final ObjectRegistration<S> routedRpcReg = rpcProviderRegistry.registerRpcImplementation(serviceClass,
- serviceInstance, ImmutableSet.of(nodeInstanceIdentifier));
- rpcRegistrations.put(serviceClass, routedRpcReg);
- if (LOG.isDebugEnabled()) {
- LOG.debug("Registration of service {} for device {}.",
- serviceClass.getSimpleName(),
- nodeInstanceIdentifier.getKey().getId().getValue());
- }
- }
+ @Override
+ public ServiceGroupIdentifier getIdentifier() {
+ return deviceInfo.getServiceIdentifier();
}
@Override
}
private void unregisterRPCs() {
- for (var iterator = Iterators.consumingIterator(rpcRegistrations.entrySet().iterator()); iterator.hasNext(); ) {
- final var rpcRegistration = iterator.next().getValue();
+ if (rpcRegistration != null) {
+ LOG.debug("Closing RPC registrations for device {}.", nodeInstanceIdentifier.getKey().getId().getValue());
rpcRegistration.close();
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Closing RPC Registration of service {} for device {}.",
- rpcRegistration.getInstance().getClass().getSimpleName(),
- nodeInstanceIdentifier.getKey().getId().getValue());
- }
+ rpcRegistration = null;
}
}
};
}
- @VisibleForTesting
- boolean isEmptyRpcRegistrations() {
- return rpcRegistrations.isEmpty();
- }
-
@Override
public DeviceInfo getDeviceInfo() {
return deviceInfo;
@Override
public void instantiateServiceInstance() {
- // TODO: Use multipart writer provider from device context
- final var multipartWriterProvider = MultipartWriterProviderFactory.createDefaultProvider(deviceContext);
+ // flow-capable-transaction.yang
+ final var sendBarrier = new SendBarrierImpl(this, deviceContext);
+
+ // sal-experimenter-message.yang
+ final var sendExperimenter = new SendExperimenterImpl(this, deviceContext, extensionConverterProvider);
- // create service instances
- final var salFlowService = new SalFlowServiceImpl(this, deviceContext, convertorExecutor);
- final var flowCapableTransactionService = new FlowCapableTransactionServiceImpl(this, deviceContext);
- final var salAsyncConfigService = new SalAsyncConfigServiceImpl(this, deviceContext);
- final var salGroupService = new SalGroupServiceImpl(this, deviceContext, convertorExecutor);
- final var salMeterService = new SalMeterServiceImpl(this, deviceContext, convertorExecutor);
- final var flowStatisticsService = OpendaylightFlowStatisticsServiceImpl.createWithOook(this, deviceContext,
- convertorExecutor);
+ // sal-flow.yang
+ final var addFlow = new AddFlowImpl(this, deviceContext, convertorExecutor);
+ final var removeFlow = new RemoveFlowImpl(this, deviceContext, convertorExecutor);
+ final var updateFlow = new UpdateFlowImpl(this, deviceContext, convertorExecutor);
- // register routed service instances
- registerRpcServiceImplementation(SalEchoService.class, new SalEchoServiceImpl(this, deviceContext));
- registerRpcServiceImplementation(SalFlowService.class, salFlowService);
- registerRpcServiceImplementation(FlowCapableTransactionService.class, flowCapableTransactionService);
- registerRpcServiceImplementation(SalAsyncConfigService.class, salAsyncConfigService);
- registerRpcServiceImplementation(SalMeterService.class, salMeterService);
- registerRpcServiceImplementation(SalGroupService.class, salGroupService);
- registerRpcServiceImplementation(SalTableService.class,
- new SalTableServiceImpl(this, deviceContext, convertorExecutor, multipartWriterProvider));
- registerRpcServiceImplementation(SalPortService.class,
- new SalPortServiceImpl(this, deviceContext, convertorExecutor));
- registerRpcServiceImplementation(PacketProcessingService.class,
- new PacketProcessingServiceImpl(this, deviceContext, convertorExecutor));
- registerRpcServiceImplementation(NodeConfigService.class, new NodeConfigServiceImpl(this, deviceContext));
- registerRpcServiceImplementation(OpendaylightFlowStatisticsService.class, flowStatisticsService);
+ // sal-group.yang
+ final var addGroup = new AddGroupImpl(this, deviceContext, convertorExecutor);
+ final var removeGroup = new RemoveGroupImpl(this, deviceContext, convertorExecutor);
+ final var updateGroup = new UpdateGroupImpl(this, deviceContext, convertorExecutor);
- // register direct statistics gathering services
- registerRpcServiceImplementation(OpendaylightDirectStatisticsService.class,
- new OpendaylightDirectStatisticsServiceImpl(deviceContext.canUseSingleLayerSerialization()
- ? SingleLayerDirectStatisticsProviderInitializer.createProvider(this, deviceContext, convertorExecutor,
- multipartWriterProvider)
- : MultiLayerDirectStatisticsProviderInitializer.createProvider(this, deviceContext, convertorExecutor,
- multipartWriterProvider)));
+ // sal-meter.yang
+ final var addMeter = new AddMeterImpl(this, deviceContext, convertorExecutor);
+ final var removeMeter = new RemoveMeterImpl(this, deviceContext, convertorExecutor);
+ final var updateMeter = new UpdateMeterImpl(this, deviceContext, convertorExecutor);
- // register flat batch services
- registerRpcServiceImplementation(SalFlatBatchService.class, new SalFlatBatchServiceImpl(
- new SalFlowsBatchServiceImpl(salFlowService, flowCapableTransactionService),
- new SalGroupsBatchServiceImpl(salGroupService, flowCapableTransactionService),
- new SalMetersBatchServiceImpl(salMeterService, flowCapableTransactionService)));
+ // FIXME: Use multipart writer provider from device context
+ final var multipartWriterProvider = MultipartWriterProviderFactory.createDefaultProvider(deviceContext);
- // register experimenter services
- registerRpcServiceImplementation(SalExperimenterMessageService.class,
- new SalExperimenterMessageServiceImpl(this, deviceContext, extensionConverterProvider));
- registerRpcServiceImplementation(SalExperimenterMpMessageService.class,
- new SalExperimenterMpMessageServiceImpl(this, deviceContext, extensionConverterProvider));
+ final var singleLayer = deviceContext.canUseSingleLayerSerialization();
- //register onf extension bundles
- registerRpcServiceImplementation(SalBundleService.class, new SalBundleServiceImpl(
- new SalExperimenterMessageServiceImpl(this, deviceContext, extensionConverterProvider)));
+ final var builder = ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+ .put(SendBarrier.class, sendBarrier)
+ // node-config.yang
+ .put(SetConfig.class, new SetConfigImpl(this, deviceContext))
+ // packet-processing.yang
+ .put(TransmitPacket.class, new TransmitPacketImpl(this, deviceContext, convertorExecutor))
+ // sal-async-config.yang
+ .put(GetAsync.class, new GetAsyncImpl(this, deviceContext))
+ .put(SetAsync.class, new SetAsyncImpl(this, deviceContext))
+ // sal-echo.yang
+ .put(SendEcho.class, new SendEchoImpl(this, deviceContext))
+ .put(SendExperimenter.class, sendExperimenter)
+ // sal-bundle.yang (ONF extension?)
+ .put(ControlBundle.class, new ControlBundleImpl(sendExperimenter))
+ .put(AddBundleMessages.class, new AddBundleMessagesImpl(sendExperimenter))
+ // sal-experimenter-mp-message.yang
+ .put(SendExperimenterMpRequest.class, new SendExperimenterMpRequestImpl(this, deviceContext,
+ extensionConverterProvider))
+ .put(AddFlow.class, addFlow)
+ .put(RemoveFlow.class, removeFlow)
+ .put(UpdateFlow.class, updateFlow)
+ .put(AddGroup.class, addGroup)
+ .put(RemoveGroup.class, removeGroup)
+ .put(UpdateGroup.class, updateGroup)
+ .put(AddMeter.class, addMeter)
+ .put(RemoveMeter.class, removeMeter)
+ .put(UpdateMeter.class, updateMeter)
+ // sal-port.yang
+ .put(UpdatePort.class, new UpdatePortImpl(this, deviceContext, convertorExecutor))
+ // sal-flat-batch.yang
+ .put(ProcessFlatBatch.class, new ProcessFlatBatchImpl(
+ // sal-flows-batch.yang
+ // FIXME: register these?
+ new AddFlowsBatchImpl(addFlow, sendBarrier),
+ new RemoveFlowsBatchImpl(removeFlow, sendBarrier),
+ new UpdateFlowsBatchImpl(updateFlow, sendBarrier),
+ // sal-groups-batch.yang
+ // FIXME: register these?
+ new AddGroupsBatchImpl(addGroup, sendBarrier),
+ new RemoveGroupsBatchImpl(removeGroup, sendBarrier),
+ new UpdateGroupsBatchImpl(updateGroup, sendBarrier),
+ // sal-meters-batch.yang
+ // FIXME: register these?
+ new AddMetersBatchImpl(addMeter, sendBarrier),
+ new RemoveMetersBatchImpl(removeMeter, sendBarrier),
+ new UpdateMetersBatchImpl(updateMeter, sendBarrier)))
+ // sal-table.yang
+ .put(UpdateTable.class, new UpdateTableImpl(this, deviceContext, convertorExecutor,
+ multipartWriterProvider))
+ // opendaylight-flow-statistics.yang
+ .put(GetAggregateFlowStatisticsFromFlowTableForGivenMatch.class,
+ new GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl(this, deviceContext, convertorExecutor))
+ // opendaylight-direct-statistics.yang
+ .put(GetFlowStatistics.class, singleLayer
+ ? new SingleGetFlowStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider)
+ : new MultiGetFlowStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider))
+ .put(GetGroupStatistics.class, singleLayer
+ ? new SingleGetGroupStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider)
+ : new MultiGetGroupStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider))
+ .put(GetQueueStatistics.class, singleLayer
+ ? new SingleGetQueueStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider)
+ : new MultiGetQueueStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider))
+ .put(GetMeterStatistics.class, singleLayer
+ ? new SingleGetMeterStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider)
+ : new MultiGetMeterStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider))
+ .put(GetNodeConnectorStatistics.class, singleLayer
+ ? new SingleGetNodeConnectorStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider)
+ : new MultiGetNodeConnectorStatistics(this, deviceContext, convertorExecutor, multipartWriterProvider));
// Support deprecated statistic related services for backward compatibility. The only exception from deprecation
// is the aggregated flow statistic with match criteria input.
if (isStatisticsRpcEnabled && !deviceContext.canUseSingleLayerSerialization()) {
final var compatibilityXidSeed = new AtomicLong();
+ // FIXME: why is this separate?
+ final var statsCompatXidSeed = new AtomicLong();
- // attach delegate to flow statistics service (to cover all but aggregated stats with match filter input)
- final var flowStatisticsDelegate = new OpendaylightFlowStatisticsServiceDelegateImpl(this, deviceContext,
- notificationPublishService, new AtomicLong(), convertorExecutor);
- flowStatisticsService.setDelegate(flowStatisticsDelegate);
+ builder
+ // Legacy RPCs
+ .put(GetAggregateFlowStatisticsFromFlowTableForAllFlows.class,
+ new GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl(this, deviceContext, convertorExecutor,
+ statsCompatXidSeed, notificationPublishService))
+ .put(GetAllFlowStatisticsFromFlowTable.class,
+ new GetAllFlowStatisticsFromFlowTableImpl(this, deviceContext, convertorExecutor,
+ statsCompatXidSeed, notificationPublishService))
+ .put(GetAllFlowsStatisticsFromAllFlowTables.class,
+ new GetAllFlowsStatisticsFromAllFlowTablesImpl(this, deviceContext, convertorExecutor,
+ statsCompatXidSeed, notificationPublishService))
+ .put(GetFlowStatisticsFromFlowTable.class,
+ new GetFlowStatisticsFromFlowTableImpl(this, deviceContext, convertorExecutor, statsCompatXidSeed,
+ notificationPublishService))
- // register all statistics (deprecated) services
- registerRpcServiceImplementation(OpendaylightFlowTableStatisticsService.class,
- new OpendaylightFlowTableStatisticsServiceImpl(this, deviceContext,
- compatibilityXidSeed, notificationPublishService));
- registerRpcServiceImplementation(OpendaylightGroupStatisticsService.class,
- new OpendaylightGroupStatisticsServiceImpl(this, deviceContext,
- compatibilityXidSeed, notificationPublishService, convertorExecutor));
- registerRpcServiceImplementation(OpendaylightMeterStatisticsService.class,
- new OpendaylightMeterStatisticsServiceImpl(this, deviceContext,
- compatibilityXidSeed, notificationPublishService, convertorExecutor));
- registerRpcServiceImplementation(OpendaylightQueueStatisticsService.class,
- new OpendaylightQueueStatisticsServiceImpl(this, deviceContext,
- compatibilityXidSeed, notificationPublishService));
- registerRpcServiceImplementation(OpendaylightPortStatisticsService.class,
- new OpendaylightPortStatisticsServiceImpl(this, deviceContext,
- compatibilityXidSeed, notificationPublishService));
+ // register all statistics (deprecated) services
+ .put(GetFlowTablesStatistics.class,
+ new GetFlowTablesStatisticsImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService))
+ .put(org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatistics.class,
+ new GetGroupStatisticsImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(GetAllGroupStatistics.class,
+ new GetAllGroupStatisticsImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(GetGroupDescription.class,
+ new GetGroupDescriptionImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(GetGroupFeatures.class,
+ new GetGroupFeaturesImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatistics.class,
+ new GetMeterStatisticsImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111
+ .GetAllMeterStatistics.class,
+ new GetAllMeterStatisticsImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(GetAllMeterConfigStatistics.class,
+ new GetAllMeterConfigStatisticsImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService, convertorExecutor))
+ .put(GetMeterFeatures.class,
+ new GetMeterFeaturesImpl(this, deviceContext, compatibilityXidSeed, notificationPublishService,
+ convertorExecutor))
+ .put(GetQueueStatisticsFromGivenPort.class,
+ new GetQueueStatisticsFromGivenPortImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService))
+ .put(GetAllQueuesStatisticsFromAllPorts.class,
+ new GetAllQueuesStatisticsFromAllPortsImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService))
+ .put(GetAllQueuesStatisticsFromGivenPort.class,
+ new GetAllQueuesStatisticsFromGivenPortImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService))
+ .put(org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214
+ .GetNodeConnectorStatistics.class,
+ new GetNodeConnectorStatisticsImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService))
+ .put(GetAllNodeConnectorsStatistics.class,
+ new GetAllNodeConnectorsStatisticsImpl(this, deviceContext, compatibilityXidSeed,
+ notificationPublishService));
}
+ rpcRegistration = rpcProviderRegistry.registerRpcImplementations(builder.build(),
+ Set.of(nodeInstanceIdentifier));
+
final var local = contextChainMastershipWatcher;
if (local != null) {
local.onMasterRoleAcquired(deviceInfo, ContextChainMastershipState.RPC_REGISTRATION);
}
}
-
- @Override
- public ServiceGroupIdentifier getIdentifier() {
- return deviceInfo.getServiceIdentifier();
- }
}
this.requestContextStack = requestContextStack;
this.deviceContext = deviceContext;
- this.datapathId = deviceInfo.getDatapathId();
- this.version = deviceInfo.getVersion();
- this.messageSpy = deviceContext.getMessageSpy();
+ datapathId = deviceInfo.getDatapathId();
+ version = deviceInfo.getVersion();
+ messageSpy = deviceContext.getMessageSpy();
}
public boolean canUseSingleLayerSerialization() {
protected abstract FutureCallback<OfHeader> createCallback(RequestContext<O> context, Class<?> requestType);
- public ListenableFuture<RpcResult<O>> handleServiceCall(@NonNull final I input) {
+ public @NonNull ListenableFuture<RpcResult<O>> handleServiceCall(@NonNull final I input) {
return handleServiceCall(input, null);
}
- public ListenableFuture<RpcResult<O>> handleServiceCall(@NonNull final I input,
+ public @NonNull ListenableFuture<RpcResult<O>> handleServiceCall(@NonNull final I input,
@Nullable final Function<OfHeader, Boolean> isComplete) {
requireNonNull(input);
+++ /dev/null
-/*
- * 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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
-
-public class EchoService extends AbstractSimpleService<EchoInputBuilder, EchoOutput> {
- public EchoService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
- super(requestContextStack, deviceContext, EchoOutput.class);
- }
-
- @Override
- protected OfHeader buildRequest(final Xid xid, final EchoInputBuilder input) {
- return input
- .setXid(xid.getValue())
- .setVersion(getVersion())
- .build();
- }
-}
* 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.sal;
+package org.opendaylight.openflowplugin.impl.services;
import static java.util.Objects.requireNonNull;
import com.google.common.util.concurrent.MoreExecutors;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.services.EchoService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SalEchoService;
+import org.opendaylight.openflowplugin.api.openflow.device.Xid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEcho;
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.echo.service.rev150305.SendEchoOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
+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;
-public final class SalEchoServiceImpl implements SalEchoService {
- private final EchoService echoService;
-
- public SalEchoServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
- echoService = new EchoService(requestContextStack, deviceContext);
+public final class SendEchoImpl extends AbstractSimpleService<EchoInputBuilder, EchoOutput> implements SendEcho {
+ public SendEchoImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
+ super(requestContextStack, deviceContext, EchoOutput.class);
}
@Override
- public ListenableFuture<RpcResult<SendEchoOutput>> sendEcho(final SendEchoInput sendEchoInput) {
- final EchoInputBuilder echoInputBld = new EchoInputBuilder()
- .setData(sendEchoInput.getData());
- return transform(echoService.handleServiceCall(echoInputBld));
- }
-
- private static ListenableFuture<RpcResult<SendEchoOutput>>
- transform(final ListenableFuture<RpcResult<EchoOutput>> rpcResultListenableFuture) {
- return Futures.transform(rpcResultListenableFuture, input -> {
+ public ListenableFuture<RpcResult<SendEchoOutput>> invoke(final SendEchoInput sendEchoInput) {
+ return Futures.transform(handleServiceCall(new EchoInputBuilder().setData(sendEchoInput.getData())), input -> {
requireNonNull(input, "echoOutput value is never expected to be NULL");
final RpcResult<SendEchoOutput> rpcOutput;
if (input.isSuccessful()) {
return rpcOutput;
}, MoreExecutors.directExecutor());
}
+
+ @Override
+ protected OfHeader buildRequest(final Xid xid, final EchoInputBuilder input) {
+ return input
+ .setXid(xid.getValue())
+ .setVersion(getVersion())
+ .build();
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+
+abstract class AbstractDeviceRpc {
+ final @NonNull DeviceContext deviceContext;
+
+ AbstractDeviceRpc(final DeviceContext deviceContext) {
+ this.deviceContext = requireNonNull(deviceContext);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerFlowService;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerFlowService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yangtools.yang.binding.RpcOutput;
+
+abstract class AbstractFlowRpc<O extends RpcOutput> extends AbstractDeviceRpc {
+ final @NonNull MultiLayerFlowService<O> multi;
+ final @NonNull SingleLayerFlowService<O> single;
+
+ AbstractFlowRpc(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final Class<O> output) {
+ super(deviceContext);
+ multi = new MultiLayerFlowService<>(requestContextStack, deviceContext, output, convertorExecutor);
+ single = new SingleLayerFlowService<>(requestContextStack, deviceContext, output);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerGroupService;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerGroupService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
+import org.opendaylight.yangtools.yang.binding.RpcOutput;
+
+abstract class AbstractGroupRpc<I extends Group, O extends RpcOutput> extends AbstractDeviceRpc {
+ final @NonNull MultiLayerGroupService<I, O> multi;
+ final @NonNull SingleLayerGroupService<O> single;
+
+ AbstractGroupRpc(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final Class<O> output) {
+ super(deviceContext);
+ multi = new MultiLayerGroupService<>(requestContextStack, deviceContext, output, convertorExecutor);
+ single = new SingleLayerGroupService<>(requestContextStack, deviceContext, output);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerMeterService;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerMeterService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
+import org.opendaylight.yangtools.yang.binding.RpcOutput;
+
+abstract class AbstractMeterRpc<I extends Meter, O extends RpcOutput> extends AbstractDeviceRpc {
+ final @NonNull MultiLayerMeterService<I, O> multi;
+ final @NonNull SingleLayerMeterService<O> single;
+
+ AbstractMeterRpc(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final Class<O> output) {
+ super(deviceContext);
+ multi = new MultiLayerMeterService<>(requestContextStack, deviceContext, output, convertorExecutor);
+ single = new SingleLayerMeterService<>(requestContextStack, deviceContext, output);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+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.MoreExecutors;
+import com.google.common.util.concurrent.SettableFuture;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessages;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSalBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.add.message.sal.SalAddMessageDataBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+public final class AddBundleMessagesImpl implements AddBundleMessages {
+ private final SendExperimenter sendExperimenter;
+
+ public AddBundleMessagesImpl(final SendExperimenter sendExperimenter) {
+ this.sendExperimenter = requireNonNull(sendExperimenter);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddBundleMessagesOutput>> invoke(final AddBundleMessagesInput input) {
+ final var partialResults = new ArrayList<ListenableFuture<RpcResult<SendExperimenterOutput>>>();
+ final var experimenterInputBuilder = new SendExperimenterInputBuilder()
+ .setNode(input.getNode());
+ final var bundleAddMessageBuilder = new BundleAddMessageSalBuilder();
+ final var dataBuilder = new SalAddMessageDataBuilder()
+ .setNode(input.getNode())
+ .setBundleId(input.getBundleId())
+ .setFlags(input.getFlags())
+ .setBundleProperty(input.getBundleProperty());
+ for (var message : input.nonnullMessages().getMessage()) {
+ dataBuilder.setBundleInnerMessage(message.getBundleInnerMessage());
+ experimenterInputBuilder.setExperimenterMessageOfChoice(
+ bundleAddMessageBuilder.setSalAddMessageData(dataBuilder.build()).build());
+ partialResults.add(sendExperimenter.invoke(experimenterInputBuilder.build()));
+ }
+
+ final var result = SettableFuture.<RpcResult<AddBundleMessagesOutput>>create();
+ Futures.addCallback(Futures.successfulAsList(partialResults),new FutureCallback<>() {
+ @Override
+ public void onSuccess(final List<RpcResult<SendExperimenterOutput>> results) {
+ final var errors = new ArrayList<RpcError>();
+ final RpcResultBuilder<AddBundleMessagesOutput> rpcResultBuilder;
+ for (var res : results) {
+ if (res == null) {
+ // FIXME: this should never happen
+ errors.add(RpcResultBuilder.newError(ErrorType.APPLICATION,
+ new ErrorTag("BundleExtensionService"), "RpcResult is null."));
+ } else if (!res.isSuccessful()) {
+ errors.addAll(res.getErrors());
+ }
+ }
+ if (errors.isEmpty()) {
+ rpcResultBuilder = RpcResultBuilder.success();
+ } else {
+ rpcResultBuilder = RpcResultBuilder.<AddBundleMessagesOutput>failed().withRpcErrors(errors);
+ }
+ result.set(rpcResultBuilder.build());
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ result.set(RpcResultBuilder.<AddBundleMessagesOutput>failed().build());
+ }
+ }, MoreExecutors.directExecutor());
+ return result;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+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.impl.registry.flow.FlowDescriptorFactory;
+import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint8;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddFlowImpl extends AbstractFlowRpc<AddFlowOutput> implements AddFlow {
+ private static final Logger LOG = LoggerFactory.getLogger(AddFlowImpl.class);
+
+ public AddFlowImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, AddFlowOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddFlowOutput>> invoke(final AddFlowInput input) {
+ final var flowRegistryKey = FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), input);
+ final var future = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.processFlowModInputBuilders(multi.toFlowModInputs(input));
+ Futures.addCallback(future, new AddFlowCallback(input, flowRegistryKey),
+ MoreExecutors.directExecutor());
+ return future;
+ }
+
+ private final class AddFlowCallback implements FutureCallback<RpcResult<AddFlowOutput>> {
+ private final AddFlowInput input;
+ private final FlowRegistryKey flowRegistryKey;
+
+ private AddFlowCallback(final AddFlowInput input, final FlowRegistryKey flowRegistryKey) {
+ this.input = input;
+ this.flowRegistryKey = flowRegistryKey;
+ }
+
+ @Override
+ public void onSuccess(final RpcResult<AddFlowOutput> rpcResult) {
+ if (!rpcResult.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Flow add failed for flow={}, errors={}", input,
+ ErrorUtil.errorsToString(rpcResult.getErrors()));
+ }
+ return;
+ }
+
+ final DeviceFlowRegistry flowRegistry = deviceContext.getDeviceFlowRegistry();
+ final FlowDescriptor flowDescriptor;
+ final FlowRef flowRef = input.getFlowRef();
+ if (flowRef != null) {
+ final Uint8 tableId = input.getTableId();
+ final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
+ flowDescriptor = FlowDescriptorFactory.create(tableId, flowId);
+
+ // FIXME: this looks like an atomic operation
+ flowRegistry.appendHistoryFlow(flowId, tableId, FlowGroupStatus.ADDED);
+ flowRegistry.storeDescriptor(flowRegistryKey, flowDescriptor);
+ } else {
+ // FIXME: this looks like an atomic operation
+ flowRegistry.store(flowRegistryKey);
+ flowDescriptor = flowRegistry.retrieveDescriptor(flowRegistryKey);
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Flow add with id={} finished without error", flowDescriptor.getFlowId().getValue());
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for adding flow={} failed", input, throwable);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.FlowUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowInputGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddFlowsBatchImpl implements AddFlowsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(AddFlowsBatchImpl.class);
+
+ private final AddFlow addFlow;
+ private final SendBarrier sendBarrier;
+
+ public AddFlowsBatchImpl(final AddFlow addFlow, final SendBarrier sendBarrier) {
+ this.addFlow = requireNonNull(addFlow);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddFlowsBatchOutput>> invoke(final AddFlowsBatchInput input) {
+ final var flows = input.nonnullBatchAddFlows().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Adding flows @ {} : {}", PathUtil.extractNodeId(input.getNode()), flows.size());
+ }
+
+ final var resultsLot = flows.stream()
+ .map(batchFlow -> addFlow.invoke(new AddFlowInputBuilder(batchFlow)
+ .setFlowRef(createFlowRef(input.getNode(), batchFlow))
+ .setNode(input.getNode())
+ .build()))
+ .toList();
+
+ final var commonResult = Futures.transform(Futures.successfulAsList(resultsLot),
+ FlowUtil.createCumulatingFunction(flows), MoreExecutors.directExecutor());
+ final var addFlowsBulkFuture = Futures.transform(commonResult, FlowUtil.FLOW_ADD_TRANSFORM,
+ MoreExecutors.directExecutor());
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(addFlowsBulkFuture, input.getNode(), sendBarrier,
+ FlowUtil.FLOW_ADD_COMPOSING_TRANSFORM)
+ : addFlowsBulkFuture;
+ }
+
+ private static FlowRef createFlowRef(final NodeRef nodeRef, final BatchFlowInputGrouping batchFlow) {
+ return FlowUtil.buildFlowPath((InstanceIdentifier<Node>) nodeRef.getValue(),
+ batchFlow.getTableId(), batchFlow.getFlowId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroup;
+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.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddGroupImpl extends AbstractGroupRpc<AddGroupInput, AddGroupOutput> implements AddGroup {
+ private static final Logger LOG = LoggerFactory.getLogger(AddGroupImpl.class);
+
+ public AddGroupImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, AddGroupOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddGroupOutput>> invoke(final AddGroupInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.handleServiceCall(input);
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<AddGroupOutput> result) {
+ if (result.isSuccessful()) {
+ LOG.debug("adding group successful {}", input.getGroupId());
+ deviceContext.getDeviceGroupRegistry().appendHistoryGroup(input.getGroupId(), input.getGroupType(),
+ FlowGroupStatus.ADDED);
+ } else if (LOG.isDebugEnabled()) {
+ LOG.debug("Group add with id={} failed, errors={}", input.getGroupId().getValue(),
+ ErrorUtil.errorsToString(result.getErrors()));
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for adding group={} failed",
+ input.getGroupId().getValue(),
+ throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.GroupUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddGroupsBatchImpl implements AddGroupsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(AddGroupsBatchImpl.class);
+
+ private final AddGroup addGroup;
+ private final SendBarrier sendBarrier;
+
+ public AddGroupsBatchImpl(final AddGroup addGroup, final SendBarrier sendBarrier) {
+ this.addGroup = requireNonNull(addGroup);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddGroupsBatchOutput>> invoke(final AddGroupsBatchInput input) {
+ final var groups = input.nonnullBatchAddGroups().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Adding groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), groups.size());
+ }
+
+ final var resultsLot = groups.stream()
+ .map(group -> addGroup.invoke(new AddGroupInputBuilder(group)
+ .setGroupRef(createGroupRef(input.getNode(), group))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ GroupUtil.createCumulatingFunction(groups), MoreExecutors.directExecutor());
+
+ final var addGroupsBulkFuture = Futures.transform(commonResult, GroupUtil.GROUP_ADD_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(addGroupsBulkFuture, input.getNode(), sendBarrier,
+ GroupUtil.GROUP_ADD_COMPOSING_TRANSFORM)
+ : addGroupsBulkFuture;
+ }
+
+ private static GroupRef createGroupRef(final NodeRef nodeRef, final Group batchGroup) {
+ return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchGroup.getGroupId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeter;
+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.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddMeterImpl extends AbstractMeterRpc<AddMeterInput, AddMeterOutput> implements AddMeter {
+ private static final Logger LOG = LoggerFactory.getLogger(AddMeterImpl.class);
+
+ public AddMeterImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, AddMeterOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddMeterOutput>> invoke(final AddMeterInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.handleServiceCall(input);
+
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<AddMeterOutput> result) {
+ if (result.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Meter add with id={} finished without error", input.getMeterId());
+ }
+ } else if (LOG.isDebugEnabled()) {
+ LOG.debug("Meter add with id={} failed, errors={}", input.getMeterId(),
+ ErrorUtil.errorsToString(result.getErrors()));
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for adding meter={} failed", input.getMeterId(), throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.MeterUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class AddMetersBatchImpl implements AddMetersBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(AddMetersBatchImpl.class);
+
+ private final AddMeter addMeter;
+ private final SendBarrier sendBarrier;
+
+ public AddMetersBatchImpl(final AddMeter addMeter, final SendBarrier sendBarrier) {
+ this.addMeter = requireNonNull(addMeter);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<AddMetersBatchOutput>> invoke(final AddMetersBatchInput input) {
+ final var meters = input.nonnullBatchAddMeters().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Adding meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), meters.size());
+ }
+
+ final var resultsLot = meters.stream()
+ .map(meter -> addMeter.invoke(new AddMeterInputBuilder(meter)
+ .setMeterRef(createMeterRef(input.getNode(), meter))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ MeterUtil.createCumulativeFunction(meters), MoreExecutors.directExecutor());
+
+ final var addMetersBulkFuture = Futures.transform(commonResult, MeterUtil.METER_ADD_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(addMetersBulkFuture, input.getNode(), sendBarrier,
+ MeterUtil.METER_ADD_COMPOSING_TRANSFORM)
+ : addMetersBulkFuture;
+ }
+
+ private static MeterRef createMeterRef(final NodeRef nodeRef, final Meter batchMeter) {
+ return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchMeter.getMeterId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundle;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSalBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.control.sal.SalControlDataBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ControlBundleImpl implements ControlBundle {
+ private static final Logger LOG = LoggerFactory.getLogger(ControlBundleImpl.class);
+
+ private final SendExperimenter sendExperimenter;
+
+ public ControlBundleImpl(final SendExperimenter sendExperimenter) {
+ this.sendExperimenter = requireNonNull(sendExperimenter);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ControlBundleOutput>> invoke(final ControlBundleInput input) {
+ LOG.debug("Control message for device {} and bundle type {}", input.getNode(), input.getType());
+ return Futures.transform(sendExperimenter.invoke(new SendExperimenterInputBuilder()
+ .setNode(input.getNode())
+ .setExperimenterMessageOfChoice(new BundleControlSalBuilder()
+ .setSalControlData(new SalControlDataBuilder(input).build())
+ .build())
+ .build()), result ->
+ result.isSuccessful() ? RpcResultBuilder.<ControlBundleOutput>success().build()
+ : RpcResultBuilder.<ControlBundleOutput>failed().build(),
+ MoreExecutors.directExecutor());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.openflowplugin.impl.services.batch.BatchPlanStep;
+import org.opendaylight.openflowplugin.impl.services.batch.BatchStepJob;
+import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchFlowAdapters;
+import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchGroupAdapters;
+import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchMeterAdapters;
+import org.opendaylight.openflowplugin.impl.util.FlatBatchUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatch;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ProcessFlatBatchImpl implements ProcessFlatBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(ProcessFlatBatchImpl.class);
+
+ private final AddFlowsBatch addFlowsBatch;
+ private final RemoveFlowsBatch removeFlowsBatch;
+ private final UpdateFlowsBatch updateFlowsBatch;
+ private final AddGroupsBatch addGroupsBatch;
+ private final RemoveGroupsBatch removeGroupsBatch;
+ private final UpdateGroupsBatch updateGroupsBatch;
+ private final AddMetersBatch addMetersBatch;
+ private final RemoveMetersBatch removeMetersBatch;
+ private final UpdateMetersBatch updateMetersBatch;
+
+ public ProcessFlatBatchImpl(final AddFlowsBatch addFlowsBatch, final RemoveFlowsBatch removeFlowsBatch,
+ final UpdateFlowsBatch updateFlowsBatch, final AddGroupsBatch addGroupsBatch,
+ final RemoveGroupsBatch removeGroupsBatch, final UpdateGroupsBatch updateGroupsBatch,
+ final AddMetersBatch addMetersBatch, final RemoveMetersBatch removeMetersBatch,
+ final UpdateMetersBatch updateMetersBatch) {
+ this.addFlowsBatch = requireNonNull(addFlowsBatch);
+ this.removeFlowsBatch = requireNonNull(removeFlowsBatch);
+ this.updateFlowsBatch = requireNonNull(updateFlowsBatch);
+ this.addGroupsBatch = requireNonNull(addGroupsBatch);
+ this.removeGroupsBatch = requireNonNull(removeGroupsBatch);
+ this.updateGroupsBatch = requireNonNull(updateGroupsBatch);
+ this.addMetersBatch = requireNonNull(addMetersBatch);
+ this.removeMetersBatch = requireNonNull(removeMetersBatch);
+ this.updateMetersBatch = requireNonNull(updateMetersBatch);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ProcessFlatBatchOutput>> invoke(final ProcessFlatBatchInput input) {
+ final var batch = input.nonnullBatch().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("processing flat batch @ {} : {}", PathUtil.extractNodeId(input.getNode()).getValue(),
+ batch.size());
+ }
+
+ // create plan
+ final var batchPlan = FlatBatchUtil.assembleBatchPlan(batch);
+ // add barriers where needed
+ FlatBatchUtil.markBarriersWhereNeeded(batchPlan);
+ // prepare chain elements
+ final var batchChainElements = prepareBatchChain(batchPlan, input.getNode(), input.getExitOnFirstError());
+ // execute plan with barriers and collect outputs chain correspondingly, collect results
+ return executeBatchPlan(batchChainElements);
+ }
+
+ @VisibleForTesting
+ static ListenableFuture<RpcResult<ProcessFlatBatchOutput>> executeBatchPlan(
+ final List<BatchStepJob> batchJobsChain) {
+ BatchStepJob batchJob;
+ final var firedJobs = new ArrayList<ListenableFuture<RpcResult<ProcessFlatBatchOutput>>>();
+ var chainSummaryResult = FlatBatchUtil.createEmptyRpcBatchResultFuture(true);
+
+ for (int i = 0; i < batchJobsChain.size(); i++) {
+ batchJob = batchJobsChain.get(i);
+ // wire actual job with chain
+ firedJobs.add(Futures.transformAsync(chainSummaryResult, batchJob.getStepFunction(),
+ MoreExecutors.directExecutor()));
+ // if barrier after actual job is needed or it is the last job -> merge fired job results with chain result
+ if (batchJob.getPlanStep().isBarrierAfter() || i == batchJobsChain.size() - 1) {
+ firedJobs.add(0, chainSummaryResult);
+ chainSummaryResult = FlatBatchUtil.mergeJobsResultsFutures(firedJobs);
+ firedJobs.clear();
+ }
+ }
+ return chainSummaryResult;
+ }
+
+ @VisibleForTesting
+ List<BatchStepJob> prepareBatchChain(final List<BatchPlanStep> batchPlan, final NodeRef node,
+ final boolean exitOnFirstError) {
+ // create batch API calls based on plan steps
+ final var chainJobs = new ArrayList<BatchStepJob>();
+ int stepOffset = 0;
+ for (final BatchPlanStep planStep : batchPlan) {
+ final int currentOffset = stepOffset;
+ chainJobs.add(new BatchStepJob(planStep, chainInput -> {
+ if (exitOnFirstError && !chainInput.isSuccessful()) {
+ LOG.debug("error on flat batch chain occurred -> skipping step {}", planStep.getStepType());
+ return FlatBatchUtil.createEmptyRpcBatchResultFuture(false);
+ }
+ LOG.trace("batch progressing on step type {}, previous steps result: {}", planStep.getStepType(),
+ chainInput.isSuccessful());
+ return getChainOutput(node, planStep, currentOffset);
+ }));
+ stepOffset += planStep.getTaskBag().size();
+ }
+
+ return chainJobs;
+ }
+
+ private ListenableFuture<RpcResult<ProcessFlatBatchOutput>> getChainOutput(final NodeRef node,
+ final BatchPlanStep planStep, final int currentOffset) {
+ return switch (planStep.getStepType()) {
+ case FLOW_ADD -> FlatBatchFlowAdapters.convertFlowBatchFutureForChain(
+ addFlowsBatch.invoke(FlatBatchFlowAdapters.adaptFlatBatchAddFlow(planStep, node)), currentOffset);
+ case FLOW_REMOVE -> FlatBatchFlowAdapters.convertFlowBatchFutureForChain(
+ removeFlowsBatch.invoke(FlatBatchFlowAdapters.adaptFlatBatchRemoveFlow(planStep, node)), currentOffset);
+ case FLOW_UPDATE -> FlatBatchFlowAdapters.convertFlowBatchFutureForChain(
+ updateFlowsBatch.invoke(FlatBatchFlowAdapters.adaptFlatBatchUpdateFlow(planStep, node)), currentOffset);
+ case GROUP_ADD -> FlatBatchGroupAdapters.convertGroupBatchFutureForChain(
+ addGroupsBatch.invoke(FlatBatchGroupAdapters.adaptFlatBatchAddGroup(planStep, node)), currentOffset);
+ case GROUP_REMOVE -> FlatBatchGroupAdapters.convertGroupBatchFutureForChain(
+ removeGroupsBatch.invoke(FlatBatchGroupAdapters.adaptFlatBatchRemoveGroup(planStep, node)),
+ currentOffset);
+ case GROUP_UPDATE -> FlatBatchGroupAdapters.convertGroupBatchFutureForChain(
+ updateGroupsBatch.invoke(FlatBatchGroupAdapters.adaptFlatBatchUpdateGroup(planStep, node)),
+ currentOffset);
+ case METER_ADD -> FlatBatchMeterAdapters.convertMeterBatchFutureForChain(
+ addMetersBatch.invoke(FlatBatchMeterAdapters.adaptFlatBatchAddMeter(planStep, node)), currentOffset);
+ case METER_REMOVE -> FlatBatchMeterAdapters.convertMeterBatchFutureForChain(
+ removeMetersBatch.invoke(FlatBatchMeterAdapters.adaptFlatBatchRemoveMeter(planStep, node)),
+ currentOffset);
+ case METER_UPDATE -> FlatBatchMeterAdapters.convertMeterBatchFutureForChain(
+ updateMetersBatch.invoke(FlatBatchMeterAdapters.adaptFlatBatchUpdateMeter(planStep, node)),
+ currentOffset);
+ };
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
+import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlow;
+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.flow.types.rev131026.FlowRef;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint8;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveFlowImpl extends AbstractFlowRpc<RemoveFlowOutput> implements RemoveFlow {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveFlowImpl.class);
+
+ public RemoveFlowImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, RemoveFlowOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveFlowOutput>> invoke(final RemoveFlowInput input) {
+ final var future = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.processFlowModInputBuilders(multi.toFlowModInputs(input));
+
+ Futures.addCallback(future, new RemoveFlowCallback(input), MoreExecutors.directExecutor());
+ return future;
+ }
+
+ private final class RemoveFlowCallback implements FutureCallback<RpcResult<RemoveFlowOutput>> {
+ private static final Uint8 OFPTT_ALL = Uint8.MAX_VALUE;
+
+ private final RemoveFlowInput input;
+
+ private RemoveFlowCallback(final RemoveFlowInput input) {
+ this.input = input;
+ }
+
+ @Override
+ public void onSuccess(final RpcResult<RemoveFlowOutput> result) {
+ if (result.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Flow remove finished without error for flow={}", input);
+ }
+ final DeviceFlowRegistry flowRegistry = deviceContext.getDeviceFlowRegistry();
+ if (input.getTableId() != null && !input.getTableId().equals(OFPTT_ALL)) {
+ var flowRegistryKey =
+ FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), input);
+ flowRegistry.addMark(flowRegistryKey);
+
+ final FlowRef flowRef = input.getFlowRef();
+ if (flowRef != null) {
+ final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
+ flowRegistry.appendHistoryFlow(flowId, input.getTableId(), FlowGroupStatus.REMOVED);
+ }
+ } else {
+ flowRegistry.clearFlowRegistry();
+ }
+ } else if (LOG.isDebugEnabled()) {
+ LOG.debug("Flow remove failed for flow={}, errors={}", input,
+ ErrorUtil.errorsToString(result.getErrors()));
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for removing flow={} failed", input, throwable);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.FlowUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowInputGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveFlowsBatchImpl implements RemoveFlowsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveFlowsBatchImpl.class);
+
+ private final RemoveFlow removeFlow;
+ private final SendBarrier sendBarrier;
+
+ public RemoveFlowsBatchImpl(final RemoveFlow removeFlow, final SendBarrier sendBarrier) {
+ this.removeFlow = requireNonNull(removeFlow);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveFlowsBatchOutput>> invoke(final RemoveFlowsBatchInput input) {
+ final var flows = input.nonnullBatchRemoveFlows().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Removing flows @ {} : {}", PathUtil.extractNodeId(input.getNode()), flows.size());
+ }
+
+ final var resultsLot = flows.stream()
+ .map(batchFlow -> removeFlow.invoke(new RemoveFlowInputBuilder(batchFlow)
+ .setFlowRef(createFlowRef(input.getNode(), batchFlow))
+ .setNode(input.getNode())
+ .build()))
+ .toList();
+
+ final var commonResult = Futures.transform(Futures.successfulAsList(resultsLot),
+ FlowUtil.createCumulatingFunction(flows), MoreExecutors.directExecutor());
+ final var removeFlowsBulkFuture = Futures.transform(commonResult, FlowUtil.FLOW_REMOVE_TRANSFORM,
+ MoreExecutors.directExecutor());
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(removeFlowsBulkFuture, input.getNode(), sendBarrier,
+ FlowUtil.FLOW_REMOVE_COMPOSING_TRANSFORM)
+ : removeFlowsBulkFuture;
+ }
+
+ private static FlowRef createFlowRef(final NodeRef nodeRef, final BatchFlowInputGrouping batchFlow) {
+ return FlowUtil.buildFlowPath((InstanceIdentifier<Node>) nodeRef.getValue(),
+ batchFlow.getTableId(), batchFlow.getFlowId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveGroupImpl extends AbstractGroupRpc<RemoveGroupInput, RemoveGroupOutput>
+ implements RemoveGroup {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveGroupImpl.class);
+
+ public RemoveGroupImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, RemoveGroupOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveGroupOutput>> invoke(final RemoveGroupInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.handleServiceCall(input);
+
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<RemoveGroupOutput> result) {
+ if (result.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Group remove with id={} finished without error", input.getGroupId().getValue());
+ deviceContext.getDeviceGroupRegistry().appendHistoryGroup(input.getGroupId(),
+ input.getGroupType(), FlowGroupStatus.REMOVED);
+ }
+ } else {
+ LOG.warn("Group remove with id={} failed, errors={}", input.getGroupId().getValue(),
+ ErrorUtil.errorsToString(result.getErrors()));
+ LOG.debug("Group input={}", input);
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for removing group={} failed", input.getGroupId().getValue(), throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.GroupUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveGroupsBatchImpl implements RemoveGroupsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveGroupsBatchImpl.class);
+
+ private final RemoveGroup removeGroup;
+ private final SendBarrier sendBarrier;
+
+ public RemoveGroupsBatchImpl(final RemoveGroup removeGroup, final SendBarrier sendBarrier) {
+ this.removeGroup = requireNonNull(removeGroup);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveGroupsBatchOutput>> invoke(final RemoveGroupsBatchInput input) {
+ final var groups = input.nonnullBatchRemoveGroups().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Removing groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), groups.size());
+ }
+
+ final var resultsLot = groups.stream()
+ .map(addGroup -> removeGroup.invoke(new RemoveGroupInputBuilder(addGroup)
+ .setGroupRef(createGroupRef(input.getNode(), addGroup))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ GroupUtil.createCumulatingFunction(groups), MoreExecutors.directExecutor());
+
+ final var removeGroupsBulkFuture = Futures.transform(commonResult, GroupUtil.GROUP_REMOVE_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(removeGroupsBulkFuture, input.getNode(), sendBarrier,
+ GroupUtil.GROUP_REMOVE_COMPOSING_TRANSFORM)
+ : removeGroupsBulkFuture;
+ }
+
+ private static GroupRef createGroupRef(final NodeRef nodeRef, final Group batchGroup) {
+ return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchGroup.getGroupId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveMeterImpl extends AbstractMeterRpc<RemoveMeterInput, RemoveMeterOutput>
+ implements RemoveMeter {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveMeterImpl.class);
+
+ public RemoveMeterImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, RemoveMeterOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveMeterOutput>> invoke(final RemoveMeterInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization() ? single.handleServiceCall(input)
+ : multi.handleServiceCall(input);
+
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<RemoveMeterOutput> result) {
+ if (result.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Meter remove with id={} finished without error", input.getMeterId());
+ }
+ } else {
+ LOG.warn("Meter remove with id={} failed, errors={}", input.getMeterId(),
+ ErrorUtil.errorsToString(result.getErrors()));
+ LOG.debug("Meter input={}", input);
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for removing meter={} failed", input.getMeterId(), throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.MeterUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RemoveMetersBatchImpl implements RemoveMetersBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(RemoveMetersBatchImpl.class);
+
+ private final RemoveMeter removeMeter;
+ private final SendBarrier sendBarrier;
+
+ public RemoveMetersBatchImpl(final RemoveMeter removeMeter, final SendBarrier sendBarrier) {
+ this.removeMeter = requireNonNull(removeMeter);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<RemoveMetersBatchOutput>> invoke(final RemoveMetersBatchInput input) {
+ final var meters = input.nonnullBatchRemoveMeters().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Removing meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), meters.size());
+ }
+
+ final var resultsLot = meters.stream()
+ .map(meter -> removeMeter.invoke(new RemoveMeterInputBuilder(meter)
+ .setMeterRef(createMeterRef(input.getNode(), meter))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ MeterUtil.createCumulativeFunction(meters), MoreExecutors.directExecutor());
+
+ final var removeMetersBulkFuture = Futures.transform(commonResult, MeterUtil.METER_REMOVE_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(removeMetersBulkFuture, input.getNode(), sendBarrier,
+ MeterUtil.METER_REMOVE_COMPOSING_TRANSFORM)
+ : removeMetersBulkFuture;
+ }
+
+ private static MeterRef createMeterRef(final NodeRef nodeRef, final Meter batchMeter) {
+ return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchMeter.getMeterId());
+ }
+}
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.sal;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerGetAsyncConfigService;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerSetAsyncConfigService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SalAsyncConfigService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncOutput;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-
-public class SalAsyncConfigServiceImpl implements SalAsyncConfigService {
-
- private final SingleLayerSetAsyncConfigService setAsyncConfigService;
- private final SingleLayerGetAsyncConfigService getAsyncConfigService;
-
- public SalAsyncConfigServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
- setAsyncConfigService = new SingleLayerSetAsyncConfigService(requestContextStack, deviceContext);
- getAsyncConfigService = new SingleLayerGetAsyncConfigService(requestContextStack, deviceContext);
- }
-
- @Override
- public ListenableFuture<RpcResult<SetAsyncOutput>> setAsync(final SetAsyncInput input) {
- return setAsyncConfigService.handleServiceCall(input);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAsyncOutput>> getAsync(final GetAsyncInput input) {
- return Futures.transform(getAsyncConfigService.handleServiceCall(input), result ->
- result != null && result.isSuccessful()
- ? RpcResultBuilder.success(new GetAsyncOutputBuilder(result.getResult()).build()).build()
- : RpcResultBuilder.<GetAsyncOutput>failed().build(),
- MoreExecutors.directExecutor());
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.sal;
-
-import static java.util.Objects.requireNonNull;
-
-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.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSalBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSalBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.add.message.sal.SalAddMessageDataBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.control.sal.SalControlDataBuilder;
-import org.opendaylight.yangtools.yang.common.ErrorTag;
-import org.opendaylight.yangtools.yang.common.ErrorType;
-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;
-
-/**
- * Simple bundle extension service.
- */
-public class SalBundleServiceImpl implements SalBundleService {
- private static final Logger LOG = LoggerFactory.getLogger(SalBundleServiceImpl.class);
-
- private final SalExperimenterMessageService experimenterMessageService;
-
- public SalBundleServiceImpl(final SalExperimenterMessageService experimenterMessageService) {
- this.experimenterMessageService = requireNonNull(experimenterMessageService,
- "SalExperimenterMessageService can not be null!");
- }
-
- @Override
- public ListenableFuture<RpcResult<ControlBundleOutput>> controlBundle(final ControlBundleInput input) {
- LOG.debug("Control message for device {} and bundle type {}", input.getNode(), input.getType());
- final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
- experimenterInputBuilder.setNode(input.getNode());
- experimenterInputBuilder.setExperimenterMessageOfChoice(
- new BundleControlSalBuilder().setSalControlData(new SalControlDataBuilder(input).build()).build());
- return Futures.transform(experimenterMessageService.sendExperimenter(
- experimenterInputBuilder.build()), sendExperimenterOutputRpcResult -> {
- if (sendExperimenterOutputRpcResult.isSuccessful()) {
- return RpcResultBuilder.<ControlBundleOutput>success().build();
- } else {
- return RpcResultBuilder.<ControlBundleOutput>failed().build();
- }
- }, MoreExecutors.directExecutor());
- }
-
- @Override
- public ListenableFuture<RpcResult<AddBundleMessagesOutput>> addBundleMessages(final AddBundleMessagesInput input) {
- final List<ListenableFuture<RpcResult<SendExperimenterOutput>>> partialResults = new ArrayList<>();
- final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
- final BundleAddMessageSalBuilder bundleAddMessageBuilder = new BundleAddMessageSalBuilder();
- final SalAddMessageDataBuilder dataBuilder = new SalAddMessageDataBuilder();
- experimenterInputBuilder.setNode(input.getNode());
- dataBuilder.setNode(input.getNode());
- dataBuilder.setBundleId(input.getBundleId());
- dataBuilder.setFlags(input.getFlags());
- dataBuilder.setBundleProperty(input.getBundleProperty());
- for (Message message : input.getMessages().getMessage()) {
- dataBuilder.setBundleInnerMessage(message.getBundleInnerMessage());
- experimenterInputBuilder.setExperimenterMessageOfChoice(
- bundleAddMessageBuilder.setSalAddMessageData(dataBuilder.build()).build());
- partialResults.add(experimenterMessageService.sendExperimenter(experimenterInputBuilder.build()));
- }
- return processResults(partialResults);
- }
-
- private static ListenableFuture<RpcResult<AddBundleMessagesOutput>> processResults(
- final List<ListenableFuture<RpcResult<SendExperimenterOutput>>> partialResults) {
- final SettableFuture<RpcResult<AddBundleMessagesOutput>> result = SettableFuture.create();
- Futures.addCallback(Futures.successfulAsList(partialResults),new FutureCallback<
- List<RpcResult<SendExperimenterOutput>>>() {
- @Override
- public void onSuccess(final List<RpcResult<SendExperimenterOutput>> results) {
- final ArrayList<RpcError> errors = new ArrayList<>();
- final RpcResultBuilder<AddBundleMessagesOutput> rpcResultBuilder;
- for (RpcResult<SendExperimenterOutput> res : results) {
- if (res == null) {
- // FIXME: this should never happen
- errors.add(RpcResultBuilder.newError(ErrorType.APPLICATION,
- new ErrorTag("BundleExtensionService"), "RpcResult is null."));
- } else if (!res.isSuccessful()) {
- errors.addAll(res.getErrors());
- }
- }
- if (errors.isEmpty()) {
- rpcResultBuilder = RpcResultBuilder.success();
- } else {
- rpcResultBuilder = RpcResultBuilder.<AddBundleMessagesOutput>failed().withRpcErrors(errors);
- }
- result.set(rpcResultBuilder.build());
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- RpcResultBuilder<AddBundleMessagesOutput> rpcResultBuilder = RpcResultBuilder.failed();
- result.set(rpcResultBuilder.build());
- }
- }, MoreExecutors.directExecutor());
- return result;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 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.sal;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.openflowplugin.impl.services.batch.BatchPlanStep;
-import org.opendaylight.openflowplugin.impl.services.batch.BatchStepJob;
-import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchFlowAdapters;
-import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchGroupAdapters;
-import org.opendaylight.openflowplugin.impl.services.batch.FlatBatchMeterAdapters;
-import org.opendaylight.openflowplugin.impl.util.FlatBatchUtil;
-import org.opendaylight.openflowplugin.impl.util.PathUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutput;
-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.flows.service.rev160314.AddFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.SalGroupsBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.SalMetersBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Default implementation of {@link SalFlowsBatchService} - delegates work to {@link SalFlowService}.
- */
-public class SalFlatBatchServiceImpl implements SalFlatBatchService {
- private static final Logger LOG = LoggerFactory.getLogger(SalFlatBatchServiceImpl.class);
-
- private final SalFlowsBatchService salFlowService;
- private final SalGroupsBatchService salGroupService;
- private final SalMetersBatchService salMeterService;
-
- public SalFlatBatchServiceImpl(final SalFlowsBatchService salFlowBatchService,
- final SalGroupsBatchService salGroupsBatchService,
- final SalMetersBatchService salMetersBatchService) {
- salFlowService = requireNonNull(salFlowBatchService, "delegate flow service must not be null");
- salGroupService = requireNonNull(salGroupsBatchService, "delegate group service must not be null");
- salMeterService = requireNonNull(salMetersBatchService, "delegate meter service must not be null");
- }
-
- @Override
- public ListenableFuture<RpcResult<ProcessFlatBatchOutput>> processFlatBatch(final ProcessFlatBatchInput input) {
- LOG.trace("processing flat batch @ {} : {}",
- PathUtil.extractNodeId(input.getNode()).getValue(),
- input.getBatch().size());
- // create plan
- final List<BatchPlanStep> batchPlan = FlatBatchUtil.assembleBatchPlan(input.nonnullBatch().values());
- // add barriers where needed
- FlatBatchUtil.markBarriersWhereNeeded(batchPlan);
- // prepare chain elements
- final List<BatchStepJob> batchChainElements =
- prepareBatchChain(batchPlan, input.getNode(), input.getExitOnFirstError());
- // execute plan with barriers and collect outputs chain correspondingly, collect results
- return executeBatchPlan(batchChainElements);
- }
-
- @VisibleForTesting
- ListenableFuture<RpcResult<ProcessFlatBatchOutput>> executeBatchPlan(final List<BatchStepJob> batchJobsChain) {
- BatchStepJob batchJob;
- final List<ListenableFuture<RpcResult<ProcessFlatBatchOutput>>> firedJobs = new ArrayList<>();
- ListenableFuture<RpcResult<ProcessFlatBatchOutput>> chainSummaryResult =
- FlatBatchUtil.createEmptyRpcBatchResultFuture(true);
-
- for (int i = 0; i < batchJobsChain.size(); i++) {
- batchJob = batchJobsChain.get(i);
- // wire actual job with chain
- firedJobs.add(Futures.transformAsync(chainSummaryResult, batchJob.getStepFunction(),
- MoreExecutors.directExecutor()));
- // if barrier after actual job is needed or it is the last job -> merge fired job results with chain result
- if (batchJob.getPlanStep().isBarrierAfter() || i == batchJobsChain.size() - 1) {
- firedJobs.add(0, chainSummaryResult);
- chainSummaryResult = FlatBatchUtil.mergeJobsResultsFutures(firedJobs);
- firedJobs.clear();
- }
- }
- return chainSummaryResult;
- }
-
- @VisibleForTesting
- List<BatchStepJob> prepareBatchChain(final List<BatchPlanStep> batchPlan,
- final NodeRef node,
- final boolean exitOnFirstError) {
- // create batch API calls based on plan steps
- final List<BatchStepJob> chainJobs = new ArrayList<>();
- int stepOffset = 0;
- for (final BatchPlanStep planStep : batchPlan) {
- final int currentOffset = stepOffset;
- chainJobs.add(new BatchStepJob(planStep, chainInput -> {
- if (exitOnFirstError && !chainInput.isSuccessful()) {
- LOG.debug("error on flat batch chain occurred -> skipping step {}", planStep.getStepType());
- return FlatBatchUtil.createEmptyRpcBatchResultFuture(false);
- }
- LOG.trace("batch progressing on step type {}, previous steps result: {}", planStep.getStepType(),
- chainInput.isSuccessful());
- return getChainOutput(node, planStep, currentOffset);
- }));
- stepOffset += planStep.getTaskBag().size();
- }
-
- return chainJobs;
- }
-
- private ListenableFuture<RpcResult<ProcessFlatBatchOutput>> getChainOutput(final NodeRef node,
- final BatchPlanStep planStep,
- final int currentOffset) {
- return switch (planStep.getStepType()) {
- case FLOW_ADD -> {
- final AddFlowsBatchInput addFlowsBatchInput =
- FlatBatchFlowAdapters.adaptFlatBatchAddFlow(planStep, node);
- final ListenableFuture<RpcResult<AddFlowsBatchOutput>> resultAddFlowFuture =
- salFlowService.addFlowsBatch(addFlowsBatchInput);
- yield FlatBatchFlowAdapters.convertFlowBatchFutureForChain(resultAddFlowFuture, currentOffset);
- }
- case FLOW_REMOVE -> {
- final RemoveFlowsBatchInput removeFlowsBatchInput =
- FlatBatchFlowAdapters.adaptFlatBatchRemoveFlow(planStep, node);
- final ListenableFuture<RpcResult<RemoveFlowsBatchOutput>> resultRemoveFlowFuture =
- salFlowService.removeFlowsBatch(removeFlowsBatchInput);
- yield FlatBatchFlowAdapters.convertFlowBatchFutureForChain(resultRemoveFlowFuture, currentOffset);
- }
- case FLOW_UPDATE -> {
- final UpdateFlowsBatchInput updateFlowsBatchInput =
- FlatBatchFlowAdapters.adaptFlatBatchUpdateFlow(planStep, node);
- final ListenableFuture<RpcResult<UpdateFlowsBatchOutput>> resultUpdateFlowFuture =
- salFlowService.updateFlowsBatch(updateFlowsBatchInput);
- yield FlatBatchFlowAdapters.convertFlowBatchFutureForChain(resultUpdateFlowFuture, currentOffset);
- }
- case GROUP_ADD -> {
- final AddGroupsBatchInput addGroupsBatchInput =
- FlatBatchGroupAdapters.adaptFlatBatchAddGroup(planStep, node);
- final ListenableFuture<RpcResult<AddGroupsBatchOutput>> resultAddGroupFuture =
- salGroupService.addGroupsBatch(addGroupsBatchInput);
- yield FlatBatchGroupAdapters.convertGroupBatchFutureForChain(resultAddGroupFuture, currentOffset);
- }
- case GROUP_REMOVE -> {
- final RemoveGroupsBatchInput removeGroupsBatchInput =
- FlatBatchGroupAdapters.adaptFlatBatchRemoveGroup(planStep, node);
- final ListenableFuture<RpcResult<RemoveGroupsBatchOutput>> resultRemoveGroupFuture =
- salGroupService.removeGroupsBatch(removeGroupsBatchInput);
- yield FlatBatchGroupAdapters.convertGroupBatchFutureForChain(resultRemoveGroupFuture, currentOffset);
- }
- case GROUP_UPDATE -> {
- final UpdateGroupsBatchInput updateGroupsBatchInput =
- FlatBatchGroupAdapters.adaptFlatBatchUpdateGroup(planStep, node);
- final ListenableFuture<RpcResult<UpdateGroupsBatchOutput>> resultUpdateGroupFuture =
- salGroupService.updateGroupsBatch(updateGroupsBatchInput);
- yield FlatBatchGroupAdapters.convertGroupBatchFutureForChain(resultUpdateGroupFuture, currentOffset);
- }
- case METER_ADD -> {
- final AddMetersBatchInput addMetersBatchInput =
- FlatBatchMeterAdapters.adaptFlatBatchAddMeter(planStep, node);
- final ListenableFuture<RpcResult<AddMetersBatchOutput>> resultAddMeterFuture =
- salMeterService.addMetersBatch(addMetersBatchInput);
- yield FlatBatchMeterAdapters.convertMeterBatchFutureForChain(resultAddMeterFuture, currentOffset);
- }
- case METER_REMOVE -> {
- final RemoveMetersBatchInput removeMetersBatchInput =
- FlatBatchMeterAdapters.adaptFlatBatchRemoveMeter(planStep, node);
- final ListenableFuture<RpcResult<RemoveMetersBatchOutput>> resultRemoveMeterFuture =
- salMeterService.removeMetersBatch(removeMetersBatchInput);
- yield FlatBatchMeterAdapters.convertMeterBatchFutureForChain(resultRemoveMeterFuture, currentOffset);
- }
- case METER_UPDATE -> {
- final UpdateMetersBatchInput updateMetersBatchInput =
- FlatBatchMeterAdapters.adaptFlatBatchUpdateMeter(planStep, node);
- final ListenableFuture<RpcResult<UpdateMetersBatchOutput>> resultUpdateMeterFuture =
- salMeterService.updateMetersBatch(updateMetersBatchInput);
- yield FlatBatchMeterAdapters.convertMeterBatchFutureForChain(resultUpdateMeterFuture, currentOffset);
- }
- default -> {
- LOG.warn("Unsupported plan-step type occurred: {} -> OMITTING", planStep.getStepType());
- yield FlatBatchUtil.createEmptyRpcBatchResultFuture(true);
- }
- };
- }
-}
+++ /dev/null
-/*
- * 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.sal;
-
-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.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-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.impl.registry.flow.FlowDescriptorFactory;
-import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
-import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerFlowService;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerFlowService;
-import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
-import org.opendaylight.openflowplugin.impl.util.FlowCreatorUtil;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
-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.flow.types.rev131026.FlowRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.opendaylight.yangtools.yang.common.Uint8;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SalFlowServiceImpl implements SalFlowService {
- private static final Logger LOG = LoggerFactory.getLogger(SalFlowServiceImpl.class);
- private static final Uint8 OFPTT_ALL = Uint8.MAX_VALUE;
-
- private final MultiLayerFlowService<UpdateFlowOutput> flowUpdate;
- private final MultiLayerFlowService<AddFlowOutput> flowAdd;
- private final MultiLayerFlowService<RemoveFlowOutput> flowRemove;
- private final SingleLayerFlowService<AddFlowOutput> flowAddMessage;
- private final SingleLayerFlowService<UpdateFlowOutput> flowUpdateMessage;
- private final SingleLayerFlowService<RemoveFlowOutput> flowRemoveMessage;
- private final DeviceContext deviceContext;
-
- public SalFlowServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor) {
- this.deviceContext = deviceContext;
- flowRemove = new MultiLayerFlowService<>(requestContextStack,
- deviceContext,
- RemoveFlowOutput.class,
- convertorExecutor);
- flowAdd = new MultiLayerFlowService<>(requestContextStack,
- deviceContext,
- AddFlowOutput.class,
- convertorExecutor);
- flowUpdate = new MultiLayerFlowService<>(requestContextStack,
- deviceContext,
- UpdateFlowOutput.class,
- convertorExecutor);
- flowAddMessage = new SingleLayerFlowService<>(requestContextStack, deviceContext, AddFlowOutput.class);
- flowUpdateMessage = new SingleLayerFlowService<>(requestContextStack, deviceContext, UpdateFlowOutput.class);
- flowRemoveMessage = new SingleLayerFlowService<>(requestContextStack, deviceContext, RemoveFlowOutput.class);
- }
-
- @Override
- public ListenableFuture<RpcResult<AddFlowOutput>> addFlow(final AddFlowInput input) {
- final FlowRegistryKey flowRegistryKey =
- FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), input);
- final ListenableFuture<RpcResult<AddFlowOutput>> future;
- if (flowAddMessage.canUseSingleLayerSerialization()) {
- future = flowAddMessage.handleServiceCall(input);
- Futures.addCallback(future, new AddFlowCallback(input, flowRegistryKey),
- MoreExecutors.directExecutor());
- } else {
- future = flowAdd.processFlowModInputBuilders(flowAdd.toFlowModInputs(input));
- Futures.addCallback(future, new AddFlowCallback(input, flowRegistryKey),
- MoreExecutors.directExecutor());
-
- }
- return future;
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveFlowOutput>> removeFlow(final RemoveFlowInput input) {
- final ListenableFuture<RpcResult<RemoveFlowOutput>> future;
- if (flowRemoveMessage.canUseSingleLayerSerialization()) {
- future = flowRemoveMessage.handleServiceCall(input);
- Futures.addCallback(future, new RemoveFlowCallback(input), MoreExecutors.directExecutor());
-
- } else {
- future = flowRemove.processFlowModInputBuilders(flowRemove.toFlowModInputs(input));
- Futures.addCallback(future, new RemoveFlowCallback(input), MoreExecutors.directExecutor());
- }
-
- return future;
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateFlowOutput>> updateFlow(final UpdateFlowInput input) {
- final UpdatedFlow updated = input.getUpdatedFlow();
- final OriginalFlow original = input.getOriginalFlow();
- final List<FlowModInputBuilder> allFlowMods = new ArrayList<>();
- final List<FlowModInputBuilder> ofFlowModInputs;
-
- ListenableFuture<RpcResult<UpdateFlowOutput>> future;
- if (flowUpdateMessage.canUseSingleLayerSerialization()) {
-
- if (!FlowCreatorUtil.canModifyFlow(original, updated, flowUpdateMessage.getVersion())) {
- final SettableFuture<RpcResult<UpdateFlowOutput>> objectSettableFuture = SettableFuture.create();
-
- final ListenableFuture<List<RpcResult<UpdateFlowOutput>>> listListenableFuture =
- Futures.successfulAsList(flowUpdateMessage.handleServiceCall(input.getOriginalFlow()),
- flowUpdateMessage.handleServiceCall(input.getUpdatedFlow()));
-
- Futures.addCallback(listListenableFuture, new FutureCallback<List<RpcResult<UpdateFlowOutput>>>() {
- @Override
- public void onSuccess(final List<RpcResult<UpdateFlowOutput>> results) {
- final ArrayList<RpcError> errors = new ArrayList<>();
- for (RpcResult<UpdateFlowOutput> flowModResult : results) {
- if (flowModResult == null) {
- errors.add(RpcResultBuilder.newError(
- ErrorType.PROTOCOL, OFConstants.APPLICATION_TAG,
- "unexpected flowMod result (null) occurred"));
- } else if (!flowModResult.isSuccessful()) {
- errors.addAll(flowModResult.getErrors());
- }
- }
-
- final RpcResultBuilder<UpdateFlowOutput> rpcResultBuilder;
- if (errors.isEmpty()) {
- rpcResultBuilder = RpcResultBuilder.success();
- } else {
- rpcResultBuilder = RpcResultBuilder.<UpdateFlowOutput>failed().withRpcErrors(errors);
- }
-
- objectSettableFuture.set(rpcResultBuilder.build());
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- RpcResultBuilder<UpdateFlowOutput> rpcResultBuilder = RpcResultBuilder.failed();
- objectSettableFuture.set(rpcResultBuilder.build());
- }
- }, MoreExecutors.directExecutor());
-
- future = objectSettableFuture;
- } else {
- future = flowUpdateMessage.handleServiceCall(input.getUpdatedFlow());
- }
- } else {
- 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<FlowModInputBuilder> ofFlowRemoveInput = flowUpdate.toFlowModInputs(removeflow.build());
- // remove flow should be the first
- allFlowMods.addAll(ofFlowRemoveInput);
- final AddFlowInputBuilder addFlowInputBuilder = new AddFlowInputBuilder(updated);
- ofFlowModInputs = flowUpdate.toFlowModInputs(addFlowInputBuilder.build());
- } else {
- ofFlowModInputs = flowUpdate.toFlowModInputs(updated);
- }
-
- allFlowMods.addAll(ofFlowModInputs);
-
- future = flowUpdate.processFlowModInputBuilders(allFlowMods);
- }
-
- Futures.addCallback(future, new UpdateFlowCallback(input), MoreExecutors.directExecutor());
- return future;
- }
-
- private final class AddFlowCallback implements FutureCallback<RpcResult<AddFlowOutput>> {
- private final AddFlowInput input;
- private final FlowRegistryKey flowRegistryKey;
-
- private AddFlowCallback(final AddFlowInput input, final FlowRegistryKey flowRegistryKey) {
- this.input = input;
- this.flowRegistryKey = flowRegistryKey;
- }
-
- @Override
- public void onSuccess(final RpcResult<AddFlowOutput> rpcResult) {
- if (!rpcResult.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Flow add failed for flow={}, errors={}", input,
- ErrorUtil.errorsToString(rpcResult.getErrors()));
- }
- return;
- }
-
- final DeviceFlowRegistry flowRegistry = deviceContext.getDeviceFlowRegistry();
- final FlowDescriptor flowDescriptor;
- final FlowRef flowRef = input.getFlowRef();
- if (flowRef != null) {
- final Uint8 tableId = input.getTableId();
- final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
- flowDescriptor = FlowDescriptorFactory.create(tableId, flowId);
-
- // FIXME: this looks like an atomic operation
- flowRegistry.appendHistoryFlow(flowId, tableId, FlowGroupStatus.ADDED);
- flowRegistry.storeDescriptor(flowRegistryKey, flowDescriptor);
- } else {
- // FIXME: this looks like an atomic operation
- flowRegistry.store(flowRegistryKey);
- flowDescriptor = flowRegistry.retrieveDescriptor(flowRegistryKey);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Flow add with id={} finished without error", flowDescriptor.getFlowId().getValue());
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for adding flow={} failed", input, throwable);
- }
- }
-
- private final class RemoveFlowCallback implements FutureCallback<RpcResult<RemoveFlowOutput>> {
- private final RemoveFlowInput input;
-
- private RemoveFlowCallback(final RemoveFlowInput input) {
- this.input = input;
- }
-
- @Override
- public void onSuccess(final RpcResult<RemoveFlowOutput> result) {
- if (result.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Flow remove finished without error for flow={}", input);
- }
- final DeviceFlowRegistry flowRegistry = deviceContext.getDeviceFlowRegistry();
- if (input.getTableId() != null && !input.getTableId().equals(OFPTT_ALL)) {
- FlowRegistryKey flowRegistryKey =
- FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), input);
- flowRegistry.addMark(flowRegistryKey);
-
- final FlowRef flowRef = input.getFlowRef();
- if (flowRef != null) {
- final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
- flowRegistry.appendHistoryFlow(flowId, input.getTableId(), FlowGroupStatus.REMOVED);
- }
- } else {
- flowRegistry.clearFlowRegistry();
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Flow remove failed for flow={}, errors={}", input,
- ErrorUtil.errorsToString(result.getErrors()));
- }
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for removing flow={} failed", input, throwable);
- }
- }
-
- private final class UpdateFlowCallback implements FutureCallback<RpcResult<UpdateFlowOutput>> {
- private final UpdateFlowInput input;
-
- private UpdateFlowCallback(final UpdateFlowInput input) {
- this.input = input;
- }
-
- @Override
- public void onSuccess(final RpcResult<UpdateFlowOutput> updateFlowOutputRpcResult) {
- final DeviceFlowRegistry deviceFlowRegistry = deviceContext.getDeviceFlowRegistry();
- final UpdatedFlow updated = input.getUpdatedFlow();
- final OriginalFlow original = input.getOriginalFlow();
- final FlowRegistryKey origFlowRegistryKey =
- FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), original);
- final FlowRegistryKey updatedFlowRegistryKey =
- FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), updated);
- final FlowDescriptor origFlowDescriptor = deviceFlowRegistry.retrieveDescriptor(origFlowRegistryKey);
-
- final boolean isUpdate = origFlowDescriptor != null;
- final FlowDescriptor updatedFlowDescriptor;
- final FlowRef flowRef = input.getFlowRef();
- if (flowRef != null) {
- final Uint8 tableId = updated.getTableId();
- final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
- // FIXME: this does not look right, we probably want better integration
- deviceFlowRegistry.appendHistoryFlow(flowId, tableId, FlowGroupStatus.MODIFIED);
-
- updatedFlowDescriptor = FlowDescriptorFactory.create(tableId, flowId);
- } else if (isUpdate) {
- updatedFlowDescriptor = origFlowDescriptor;
- } else {
- deviceFlowRegistry.store(updatedFlowRegistryKey);
- updatedFlowDescriptor = deviceFlowRegistry.retrieveDescriptor(updatedFlowRegistryKey);
- }
-
- if (isUpdate) {
- deviceFlowRegistry.addMark(origFlowRegistryKey);
- deviceFlowRegistry.storeDescriptor(updatedFlowRegistryKey, updatedFlowDescriptor);
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for updating flow={} failed", input, throwable);
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 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.sal;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import java.util.ArrayList;
-import java.util.List;
-import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
-import org.opendaylight.openflowplugin.impl.util.FlowUtil;
-import org.opendaylight.openflowplugin.impl.util.PathUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
-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.OriginalFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowInputGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowInputUpdateGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.output.list.grouping.BatchFailedFlowsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.update.flows.batch.input.BatchUpdateFlows;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Default implementation of {@link SalFlowsBatchService} - delegates work to {@link SalFlowService}.
- */
-public class SalFlowsBatchServiceImpl implements SalFlowsBatchService {
- private static final Logger LOG = LoggerFactory.getLogger(SalFlowsBatchServiceImpl.class);
-
- private final SalFlowService salFlowService;
- private final FlowCapableTransactionService transactionService;
-
- public SalFlowsBatchServiceImpl(final SalFlowService salFlowService,
- final FlowCapableTransactionService transactionService) {
- this.salFlowService = requireNonNull(salFlowService, "delegate flow service must not be null");
- this.transactionService = requireNonNull(transactionService, "delegate transaction service must not be null");
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveFlowsBatchOutput>> removeFlowsBatch(final RemoveFlowsBatchInput input) {
- LOG.trace("Removing flows @ {} : {}",
- PathUtil.extractNodeId(input.getNode()),
- input.getBatchRemoveFlows().size());
- final ArrayList<ListenableFuture<RpcResult<RemoveFlowOutput>>> resultsLot = new ArrayList<>();
- for (BatchFlowInputGrouping batchFlow : input.nonnullBatchRemoveFlows().values()) {
- final RemoveFlowInput removeFlowInput = new RemoveFlowInputBuilder(batchFlow)
- .setFlowRef(createFlowRef(input.getNode(), batchFlow))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salFlowService.removeFlow(removeFlowInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedFlowsOutput>>> commonResult =
- Futures.transform(Futures.successfulAsList(resultsLot),
- FlowUtil.createCumulatingFunction(input.nonnullBatchRemoveFlows().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<RemoveFlowsBatchOutput>> removeFlowsBulkFuture =
- Futures.transform(commonResult, FlowUtil.FLOW_REMOVE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- removeFlowsBulkFuture = BarrierUtil.chainBarrier(removeFlowsBulkFuture, input.getNode(),
- transactionService, FlowUtil.FLOW_REMOVE_COMPOSING_TRANSFORM);
- }
-
- return removeFlowsBulkFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<AddFlowsBatchOutput>> addFlowsBatch(final AddFlowsBatchInput input) {
- LOG.trace("Adding flows @ {} : {}", PathUtil.extractNodeId(input.getNode()), input.getBatchAddFlows().size());
- final ArrayList<ListenableFuture<RpcResult<AddFlowOutput>>> resultsLot = new ArrayList<>();
- for (BatchFlowInputGrouping batchFlow : input.nonnullBatchAddFlows().values()) {
- final AddFlowInput addFlowInput = new AddFlowInputBuilder(batchFlow)
- .setFlowRef(createFlowRef(input.getNode(), batchFlow))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salFlowService.addFlow(addFlowInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedFlowsOutput>>> commonResult =
- Futures.transform(Futures.successfulAsList(resultsLot),
- FlowUtil.createCumulatingFunction(input.nonnullBatchAddFlows().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<AddFlowsBatchOutput>> addFlowsBulkFuture =
- Futures.transform(commonResult, FlowUtil.FLOW_ADD_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- addFlowsBulkFuture = BarrierUtil.chainBarrier(addFlowsBulkFuture, input.getNode(),
- transactionService, FlowUtil.FLOW_ADD_COMPOSING_TRANSFORM);
- }
-
- return addFlowsBulkFuture;
- }
-
- private static FlowRef createFlowRef(final NodeRef nodeRef, final BatchFlowInputGrouping batchFlow) {
- return FlowUtil.buildFlowPath((InstanceIdentifier<Node>) nodeRef.getValue(),
- batchFlow.getTableId(), batchFlow.getFlowId());
- }
-
- private static FlowRef createFlowRef(final NodeRef nodeRef, final BatchFlowInputUpdateGrouping batchFlow) {
- return FlowUtil.buildFlowPath((InstanceIdentifier<Node>) nodeRef.getValue(),
- batchFlow.getOriginalBatchedFlow().getTableId(), batchFlow.getFlowId());
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateFlowsBatchOutput>> updateFlowsBatch(final UpdateFlowsBatchInput input) {
- LOG.trace("Updating flows @ {} : {}",
- PathUtil.extractNodeId(input.getNode()),
- input.getBatchUpdateFlows().size());
- final ArrayList<ListenableFuture<RpcResult<UpdateFlowOutput>>> resultsLot = new ArrayList<>();
- for (BatchUpdateFlows batchFlow : input.nonnullBatchUpdateFlows().values()) {
- final UpdateFlowInput updateFlowInput = new UpdateFlowInputBuilder(input)
- .setOriginalFlow(new OriginalFlowBuilder(batchFlow.getOriginalBatchedFlow()).build())
- .setUpdatedFlow(new UpdatedFlowBuilder(batchFlow.getUpdatedBatchedFlow()).build())
- .setFlowRef(createFlowRef(input.getNode(), batchFlow))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salFlowService.updateFlow(updateFlowInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedFlowsOutput>>> commonResult =
- Futures.transform(Futures.successfulAsList(resultsLot),
- FlowUtil.createCumulatingFunction(input.nonnullBatchUpdateFlows().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<UpdateFlowsBatchOutput>> updateFlowsBulkFuture =
- Futures.transform(commonResult, FlowUtil.FLOW_UPDATE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- updateFlowsBulkFuture = BarrierUtil.chainBarrier(updateFlowsBulkFuture, input.getNode(),
- transactionService, FlowUtil.FLOW_UPDATE_COMPOSING_TRANSFORM);
- }
-
- return updateFlowsBulkFuture;
- }
-}
+++ /dev/null
-/*
- * 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.sal;
-
-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.MoreExecutors;
-import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerGroupService;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerGroupService;
-import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
-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.service.rev130918.group.update.UpdatedGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SalGroupServiceImpl implements SalGroupService {
- private static final Logger LOG = LoggerFactory.getLogger(SalGroupServiceImpl.class);
- private final MultiLayerGroupService<AddGroupInput, AddGroupOutput> addGroup;
- private final MultiLayerGroupService<Group, UpdateGroupOutput> updateGroup;
- private final MultiLayerGroupService<RemoveGroupInput, RemoveGroupOutput> removeGroup;
- private final SingleLayerGroupService<AddGroupOutput> addGroupMessage;
- private final SingleLayerGroupService<UpdateGroupOutput> updateGroupMessage;
- private final SingleLayerGroupService<RemoveGroupOutput> removeGroupMessage;
-
- private final DeviceContext deviceContext;
-
- public SalGroupServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor) {
- this.deviceContext = deviceContext;
- addGroup = new MultiLayerGroupService<>(requestContextStack,
- deviceContext,
- AddGroupOutput.class,
- convertorExecutor);
-
- updateGroup = new MultiLayerGroupService<>(requestContextStack,
- deviceContext,
- UpdateGroupOutput.class,
- convertorExecutor);
-
- removeGroup = new MultiLayerGroupService<>(requestContextStack,
- deviceContext,
- RemoveGroupOutput.class,
- convertorExecutor);
-
- addGroupMessage = new SingleLayerGroupService<>(requestContextStack, deviceContext, AddGroupOutput.class);
- updateGroupMessage = new SingleLayerGroupService<>(requestContextStack, deviceContext, UpdateGroupOutput.class);
- removeGroupMessage = new SingleLayerGroupService<>(requestContextStack, deviceContext, RemoveGroupOutput.class);
- }
-
- @Override
- public ListenableFuture<RpcResult<AddGroupOutput>> addGroup(final AddGroupInput input) {
- final ListenableFuture<RpcResult<AddGroupOutput>> resultFuture =
- addGroupMessage.canUseSingleLayerSerialization()
- ? addGroupMessage.handleServiceCall(input)
- : addGroup.handleServiceCall(input);
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<AddGroupOutput>>() {
- @Override
- public void onSuccess(final RpcResult<AddGroupOutput> result) {
- if (result.isSuccessful()) {
- LOG.debug("adding group successful {}", input.getGroupId());
- deviceContext.getDeviceGroupRegistry().appendHistoryGroup(input.getGroupId(), input.getGroupType(),
- FlowGroupStatus.ADDED);
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Group add with id={} failed, errors={}", input.getGroupId().getValue(),
- ErrorUtil.errorsToString(result.getErrors()));
- }
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for adding group={} failed",
- input.getGroupId().getValue(),
- throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-
-
- @Override
- public ListenableFuture<RpcResult<UpdateGroupOutput>> updateGroup(final UpdateGroupInput input) {
- final ListenableFuture<RpcResult<UpdateGroupOutput>> resultFuture =
- updateGroupMessage.canUseSingleLayerSerialization()
- ? updateGroupMessage.handleServiceCall(input.getUpdatedGroup())
- : updateGroup.handleServiceCall(input.getUpdatedGroup());
-
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<UpdateGroupOutput>>() {
- @Override
- public void onSuccess(final RpcResult<UpdateGroupOutput> result) {
- if (result.isSuccessful()) {
- UpdatedGroup updatedGroup = input.getUpdatedGroup();
- deviceContext.getDeviceGroupRegistry().appendHistoryGroup(
- updatedGroup.getGroupId(), updatedGroup.getGroupType(), FlowGroupStatus.MODIFIED);
- if (LOG.isDebugEnabled()) {
- LOG.debug("Group update with original id={} finished without error",
- input.getOriginalGroup().getGroupId().getValue());
- }
- } else {
- LOG.warn("Group update with original id={} failed, errors={}",
- input.getOriginalGroup().getGroupId(), ErrorUtil.errorsToString(result.getErrors()));
- LOG.debug("Group input={}", input.getUpdatedGroup());
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for updating group={} failed",
- input.getOriginalGroup().getGroupId(), throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveGroupOutput>> removeGroup(final RemoveGroupInput input) {
- final ListenableFuture<RpcResult<RemoveGroupOutput>> resultFuture =
- removeGroupMessage.canUseSingleLayerSerialization()
- ? removeGroupMessage.handleServiceCall(input)
- : removeGroup.handleServiceCall(input);
-
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<RemoveGroupOutput>>() {
- @Override
- public void onSuccess(final RpcResult<RemoveGroupOutput> result) {
- if (result.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Group remove with id={} finished without error", input.getGroupId().getValue());
- deviceContext.getDeviceGroupRegistry().appendHistoryGroup(input.getGroupId(),
- input.getGroupType(), FlowGroupStatus.REMOVED);
- }
- } else {
- LOG.warn("Group remove with id={} failed, errors={}", input.getGroupId().getValue(),
- ErrorUtil.errorsToString(result.getErrors()));
- LOG.debug("Group input={}", input);
- }
- }
-
- @Override
- public void onFailure(final Throwable throwable) {
- LOG.warn("Service call for removing group={} failed",
- input.getGroupId().getValue(), throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 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.sal;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
-import org.opendaylight.openflowplugin.impl.util.GroupUtil;
-import org.opendaylight.openflowplugin.impl.util.PathUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.BatchGroupInputUpdateGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.SalGroupsBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroups;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.output.list.grouping.BatchFailedGroupsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroups;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Default implementation of {@link SalGroupsBatchService} - delegates work to {@link SalGroupService}.
- */
-public class SalGroupsBatchServiceImpl implements SalGroupsBatchService {
- private static final Logger LOG = LoggerFactory.getLogger(SalGroupsBatchServiceImpl.class);
-
- private final SalGroupService salGroupService;
- private final FlowCapableTransactionService transactionService;
-
- public SalGroupsBatchServiceImpl(final SalGroupService salGroupService,
- final FlowCapableTransactionService transactionService) {
- this.salGroupService = requireNonNull(salGroupService);
- this.transactionService = requireNonNull(transactionService);
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateGroupsBatchOutput>> updateGroupsBatch(final UpdateGroupsBatchInput input) {
- final List<BatchUpdateGroups> batchUpdateGroups = input.getBatchUpdateGroups();
- LOG.trace("Updating groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateGroups.size());
-
- final ArrayList<ListenableFuture<RpcResult<UpdateGroupOutput>>> resultsLot = new ArrayList<>();
- for (BatchUpdateGroups batchGroup : batchUpdateGroups) {
- final UpdateGroupInput updateGroupInput = new UpdateGroupInputBuilder(input)
- .setOriginalGroup(new OriginalGroupBuilder(batchGroup.getOriginalBatchedGroup()).build())
- .setUpdatedGroup(new UpdatedGroupBuilder(batchGroup.getUpdatedBatchedGroup()).build())
- .setGroupRef(createGroupRef(input.getNode(), batchGroup)).setNode(input.getNode()).build();
- resultsLot.add(salGroupService.updateGroup(updateGroupInput));
- }
-
- final Iterable<Group> groups = batchUpdateGroups.stream()
- .map(BatchGroupInputUpdateGrouping::getUpdatedBatchedGroup).collect(Collectors.toList());
-
- final ListenableFuture<RpcResult<List<BatchFailedGroupsOutput>>> commonResult = Futures
- .transform(Futures.allAsList(resultsLot),
- GroupUtil.createCumulatingFunction(groups, batchUpdateGroups.size()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<UpdateGroupsBatchOutput>> updateGroupsBulkFuture = Futures
- .transform(commonResult, GroupUtil.GROUP_UPDATE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- updateGroupsBulkFuture = BarrierUtil
- .chainBarrier(updateGroupsBulkFuture, input.getNode(), transactionService,
- GroupUtil.GROUP_UPDATE_COMPOSING_TRANSFORM);
- }
-
- return updateGroupsBulkFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<AddGroupsBatchOutput>> addGroupsBatch(final AddGroupsBatchInput input) {
- LOG.trace("Adding groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), input.getBatchAddGroups().size());
- final ArrayList<ListenableFuture<RpcResult<AddGroupOutput>>> resultsLot = new ArrayList<>();
- for (BatchAddGroups addGroup : input.nonnullBatchAddGroups().values()) {
- final AddGroupInput addGroupInput = new AddGroupInputBuilder(addGroup)
- .setGroupRef(createGroupRef(input.getNode(), addGroup)).setNode(input.getNode()).build();
- resultsLot.add(salGroupService.addGroup(addGroupInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedGroupsOutput>>> commonResult = Futures
- .transform(Futures.allAsList(resultsLot),
- GroupUtil.createCumulatingFunction(input.nonnullBatchAddGroups().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<AddGroupsBatchOutput>> addGroupsBulkFuture = Futures
- .transform(commonResult, GroupUtil.GROUP_ADD_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- addGroupsBulkFuture = BarrierUtil.chainBarrier(addGroupsBulkFuture, input.getNode(), transactionService,
- GroupUtil.GROUP_ADD_COMPOSING_TRANSFORM);
- }
-
- return addGroupsBulkFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveGroupsBatchOutput>> removeGroupsBatch(final RemoveGroupsBatchInput input) {
- LOG.trace("Removing groups @ {} : {}", PathUtil.extractNodeId(input.getNode()),
- input.getBatchRemoveGroups().size());
- final ArrayList<ListenableFuture<RpcResult<RemoveGroupOutput>>> resultsLot = new ArrayList<>();
- for (BatchRemoveGroups addGroup : input.nonnullBatchRemoveGroups().values()) {
- final RemoveGroupInput removeGroupInput = new RemoveGroupInputBuilder(addGroup)
- .setGroupRef(createGroupRef(input.getNode(), addGroup)).setNode(input.getNode()).build();
- resultsLot.add(salGroupService.removeGroup(removeGroupInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedGroupsOutput>>> commonResult = Futures
- .transform(Futures.allAsList(resultsLot),
- GroupUtil.createCumulatingFunction(input.nonnullBatchRemoveGroups().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<RemoveGroupsBatchOutput>> removeGroupsBulkFuture = Futures
- .transform(commonResult, GroupUtil.GROUP_REMOVE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- removeGroupsBulkFuture = BarrierUtil
- .chainBarrier(removeGroupsBulkFuture, input.getNode(), transactionService,
- GroupUtil.GROUP_REMOVE_COMPOSING_TRANSFORM);
- }
-
- return removeGroupsBulkFuture;
- }
-
- private static GroupRef createGroupRef(final NodeRef nodeRef, final Group batchGroup) {
- return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchGroup.getGroupId());
- }
-
- private static GroupRef createGroupRef(final NodeRef nodeRef, final BatchUpdateGroups batchGroup) {
- return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(),
- batchGroup.getUpdatedBatchedGroup().getGroupId());
- }
-}
+++ /dev/null
-/*
- * 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.sal;
-
-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.MoreExecutors;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerMeterService;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerMeterService;
-import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
-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.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SalMeterServiceImpl implements SalMeterService {
- private static final Logger LOG = LoggerFactory.getLogger(SalMeterServiceImpl.class);
- private final MultiLayerMeterService<AddMeterInput, AddMeterOutput> addMeter;
- private final MultiLayerMeterService<Meter, UpdateMeterOutput> updateMeter;
- private final MultiLayerMeterService<RemoveMeterInput, RemoveMeterOutput> removeMeter;
- private final SingleLayerMeterService<AddMeterOutput> addMeterMessage;
- private final SingleLayerMeterService<UpdateMeterOutput> updateMeterMessage;
- private final SingleLayerMeterService<RemoveMeterOutput> removeMeterMessage;
-
- private final DeviceContext deviceContext;
-
- public SalMeterServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor) {
- this.deviceContext = deviceContext;
- addMeter = new MultiLayerMeterService<>(requestContextStack,
- deviceContext,
- AddMeterOutput.class,
- convertorExecutor);
-
- updateMeter = new MultiLayerMeterService<>(requestContextStack,
- deviceContext,
- UpdateMeterOutput.class,
- convertorExecutor);
-
- removeMeter = new MultiLayerMeterService<>(requestContextStack,
- deviceContext,
- RemoveMeterOutput.class,
- convertorExecutor);
-
- addMeterMessage = new SingleLayerMeterService<>(requestContextStack, deviceContext, AddMeterOutput.class);
- updateMeterMessage = new SingleLayerMeterService<>(requestContextStack, deviceContext, UpdateMeterOutput.class);
- removeMeterMessage = new SingleLayerMeterService<>(requestContextStack, deviceContext, RemoveMeterOutput.class);
- }
-
- @Override
- public ListenableFuture<RpcResult<AddMeterOutput>> addMeter(final AddMeterInput input) {
- final ListenableFuture<RpcResult<AddMeterOutput>> resultFuture =
- addMeterMessage.canUseSingleLayerSerialization()
- ? addMeterMessage.handleServiceCall(input)
- : addMeter.handleServiceCall(input);
-
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<AddMeterOutput>>() {
- @Override
- public void onSuccess(RpcResult<AddMeterOutput> result) {
- if (result.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Meter add with id={} finished without error", input.getMeterId());
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Meter add with id={} failed, errors={}", input.getMeterId(),
- ErrorUtil.errorsToString(result.getErrors()));
- }
- }
- }
-
- @Override
- public void onFailure(Throwable throwable) {
- LOG.warn("Service call for adding meter={} failed", input.getMeterId(), throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateMeterOutput>> updateMeter(final UpdateMeterInput input) {
- final ListenableFuture<RpcResult<UpdateMeterOutput>> resultFuture =
- updateMeterMessage.canUseSingleLayerSerialization()
- ? updateMeterMessage.handleServiceCall(input.getUpdatedMeter())
- : updateMeter.handleServiceCall(input.getUpdatedMeter());
-
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<UpdateMeterOutput>>() {
- @Override
- public void onSuccess(RpcResult<UpdateMeterOutput> result) {
- if (result.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Meter update with id={} finished without error",
- input.getOriginalMeter().getMeterId());
- }
- } else {
- LOG.warn("Meter update with id={} failed, errors={}", input.getOriginalMeter().getMeterId(),
- ErrorUtil.errorsToString(result.getErrors()));
- LOG.debug("Meter input={}", input.getUpdatedMeter());
- }
- }
-
- @Override
- public void onFailure(Throwable throwable) {
- LOG.warn("Service call for updating meter={} failed",
- input.getOriginalMeter().getMeterId(), throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveMeterOutput>> removeMeter(final RemoveMeterInput input) {
- final ListenableFuture<RpcResult<RemoveMeterOutput>> resultFuture =
- removeMeterMessage.canUseSingleLayerSerialization()
- ? removeMeterMessage.handleServiceCall(input)
- : removeMeter.handleServiceCall(input);
-
- Futures.addCallback(resultFuture, new FutureCallback<RpcResult<RemoveMeterOutput>>() {
- @Override
- public void onSuccess(RpcResult<RemoveMeterOutput> result) {
- if (result.isSuccessful()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Meter remove with id={} finished without error", input.getMeterId());
- }
- } else {
- LOG.warn("Meter remove with id={} failed, errors={}", input.getMeterId(),
- ErrorUtil.errorsToString(result.getErrors()));
- LOG.debug("Meter input={}", input);
- }
- }
-
- @Override
- public void onFailure(Throwable throwable) {
- LOG.warn("Service call for removing meter={} failed", input.getMeterId(), throwable);
- }
- }, MoreExecutors.directExecutor());
- return resultFuture;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 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.sal;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
-import org.opendaylight.openflowplugin.impl.util.MeterUtil;
-import org.opendaylight.openflowplugin.impl.util.PathUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterInputUpdateGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.SalMetersBatchService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.output.list.grouping.BatchFailedMetersOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Default implementation of {@link SalMetersBatchService} - delegates work to {@link SalMeterService}.
- */
-public class SalMetersBatchServiceImpl implements SalMetersBatchService {
- private static final Logger LOG = LoggerFactory.getLogger(SalMetersBatchServiceImpl.class);
-
- private final SalMeterService salMeterService;
- private final FlowCapableTransactionService transactionService;
-
- public SalMetersBatchServiceImpl(final SalMeterService salMeterService,
- final FlowCapableTransactionService transactionService) {
- this.salMeterService = requireNonNull(salMeterService);
- this.transactionService = requireNonNull(transactionService);
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateMetersBatchOutput>> updateMetersBatch(final UpdateMetersBatchInput input) {
- final List<BatchUpdateMeters> batchUpdateMeters = input.getBatchUpdateMeters();
- LOG.trace("Updating meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateMeters.size());
-
- final ArrayList<ListenableFuture<RpcResult<UpdateMeterOutput>>> resultsLot = new ArrayList<>();
- for (BatchUpdateMeters batchMeter : batchUpdateMeters) {
- final UpdateMeterInput updateMeterInput = new UpdateMeterInputBuilder(input)
- .setOriginalMeter(new OriginalMeterBuilder(batchMeter.getOriginalBatchedMeter()).build())
- .setUpdatedMeter(new UpdatedMeterBuilder(batchMeter.getUpdatedBatchedMeter()).build())
- .setMeterRef(createMeterRef(input.getNode(), batchMeter))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salMeterService.updateMeter(updateMeterInput));
- }
-
- final Iterable<Meter> meters = batchUpdateMeters.stream()
- .map(BatchMeterInputUpdateGrouping::getUpdatedBatchedMeter)
- .collect(Collectors.toList());
-
- final ListenableFuture<RpcResult<List<BatchFailedMetersOutput>>> commonResult =
- Futures.transform(Futures.allAsList(resultsLot),
- MeterUtil.createCumulativeFunction(meters, batchUpdateMeters.size()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<UpdateMetersBatchOutput>> updateMetersBulkFuture =
- Futures.transform(commonResult, MeterUtil.METER_UPDATE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- updateMetersBulkFuture = BarrierUtil.chainBarrier(updateMetersBulkFuture, input.getNode(),
- transactionService, MeterUtil.METER_UPDATE_COMPOSING_TRANSFORM);
- }
-
- return updateMetersBulkFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<AddMetersBatchOutput>> addMetersBatch(final AddMetersBatchInput input) {
- LOG.trace("Adding meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), input.getBatchAddMeters().size());
- final ArrayList<ListenableFuture<RpcResult<AddMeterOutput>>> resultsLot = new ArrayList<>();
- for (BatchAddMeters addMeter : input.nonnullBatchAddMeters().values()) {
- final AddMeterInput addMeterInput = new AddMeterInputBuilder(addMeter)
- .setMeterRef(createMeterRef(input.getNode(), addMeter))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salMeterService.addMeter(addMeterInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedMetersOutput>>> commonResult =
- Futures.transform(Futures.allAsList(resultsLot),
- MeterUtil.createCumulativeFunction(input.nonnullBatchAddMeters().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<AddMetersBatchOutput>> addMetersBulkFuture =
- Futures.transform(commonResult, MeterUtil.METER_ADD_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- addMetersBulkFuture = BarrierUtil.chainBarrier(addMetersBulkFuture, input.getNode(),
- transactionService, MeterUtil.METER_ADD_COMPOSING_TRANSFORM);
- }
-
- return addMetersBulkFuture;
- }
-
- @Override
- public ListenableFuture<RpcResult<RemoveMetersBatchOutput>> removeMetersBatch(final RemoveMetersBatchInput input) {
- LOG.trace("Removing meters @ {} : {}",
- PathUtil.extractNodeId(input.getNode()),
- input.getBatchRemoveMeters().size());
- final ArrayList<ListenableFuture<RpcResult<RemoveMeterOutput>>> resultsLot = new ArrayList<>();
- for (BatchRemoveMeters addMeter : input.nonnullBatchRemoveMeters().values()) {
- final RemoveMeterInput removeMeterInput = new RemoveMeterInputBuilder(addMeter)
- .setMeterRef(createMeterRef(input.getNode(), addMeter))
- .setNode(input.getNode())
- .build();
- resultsLot.add(salMeterService.removeMeter(removeMeterInput));
- }
-
- final ListenableFuture<RpcResult<List<BatchFailedMetersOutput>>> commonResult =
- Futures.transform(Futures.allAsList(resultsLot),
- MeterUtil.createCumulativeFunction(input.nonnullBatchRemoveMeters().values()),
- MoreExecutors.directExecutor());
-
- ListenableFuture<RpcResult<RemoveMetersBatchOutput>> removeMetersBulkFuture =
- Futures.transform(commonResult, MeterUtil.METER_REMOVE_TRANSFORM, MoreExecutors.directExecutor());
-
- if (input.getBarrierAfter()) {
- removeMetersBulkFuture = BarrierUtil.chainBarrier(removeMetersBulkFuture, input.getNode(),
- transactionService, MeterUtil.METER_REMOVE_COMPOSING_TRANSFORM);
- }
-
- return removeMetersBulkFuture;
- }
-
- private static MeterRef createMeterRef(final NodeRef nodeRef, final Meter batchMeter) {
- return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(), batchMeter.getMeterId());
- }
-
- private static MeterRef createMeterRef(final NodeRef nodeRef, final BatchUpdateMeters batchMeter) {
- return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(),
- batchMeter.getUpdatedBatchedMeter().getMeterId());
- }
-}
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.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
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.RpcResult;
-public class FlowCapableTransactionServiceImpl extends AbstractSimpleService<SendBarrierInput, SendBarrierOutput>
- implements FlowCapableTransactionService {
- public FlowCapableTransactionServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext) {
+public final class SendBarrierImpl extends AbstractSimpleService<SendBarrierInput, SendBarrierOutput>
+ implements SendBarrier {
+ public SendBarrierImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
super(requestContextStack, deviceContext, SendBarrierOutput.class);
}
@Override
- public ListenableFuture<RpcResult<SendBarrierOutput>> sendBarrier(final SendBarrierInput input) {
+ public ListenableFuture<RpcResult<SendBarrierOutput>> invoke(final SendBarrierInput input) {
return handleServiceCall(input);
}
import org.opendaylight.openflowplugin.extension.api.exception.ConverterNotFoundException;
import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService;
import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInputBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class SalExperimenterMessageServiceImpl extends AbstractSimpleService<SendExperimenterInput,
- SendExperimenterOutput> implements SalExperimenterMessageService {
- private static final Logger LOG = LoggerFactory.getLogger(SalExperimenterMessageServiceImpl.class);
+public final class SendExperimenterImpl extends AbstractSimpleService<SendExperimenterInput, SendExperimenterOutput>
+ implements SendExperimenter {
+ private static final Logger LOG = LoggerFactory.getLogger(SendExperimenterImpl.class);
private final ExtensionConverterProvider extensionConverterProvider;
- public SalExperimenterMessageServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ExtensionConverterProvider extensionConverterProvider) {
+ public SendExperimenterImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ExtensionConverterProvider extensionConverterProvider) {
super(requestContextStack, deviceContext, SendExperimenterOutput.class);
this.extensionConverterProvider = extensionConverterProvider;
}
@Override
- protected OfHeader buildRequest(Xid xid, SendExperimenterInput input) throws ServiceException {
+ public ListenableFuture<RpcResult<SendExperimenterOutput>> invoke(final SendExperimenterInput input) {
+ return handleServiceCall(input);
+ }
+
+ @Override
+ protected OfHeader buildRequest(final Xid xid, final SendExperimenterInput input) throws ServiceException {
final TypeVersionKey key =
new TypeVersionKey(input.getExperimenterMessageOfChoice().implementedInterface(), getVersion());
final ConverterMessageToOFJava<ExperimenterMessageOfChoice, ExperimenterDataOfChoice,
}
final ExperimenterInputBuilder experimenterInputBld;
try {
- final ExtensionConvertorData data = new ExtensionConvertorData(OFConstants.OFP_VERSION_1_3);
+ final var data = new ExtensionConvertorData(OFConstants.OFP_VERSION_1_3);
data.setXid(xid.getValue());
data.setDatapathId(extractDatapathId(input.getNode()));
experimenterInputBld = new ExperimenterInputBuilder()
return experimenterInputBld.build();
}
-
- @Override
- public ListenableFuture<RpcResult<SendExperimenterOutput>> sendExperimenter(SendExperimenterInput input) {
- return handleServiceCall(input);
- }
}
* 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.sal;
import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerExperimenterMultipartService;
import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerExperimenterMultipartService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SalExperimenterMpMessageService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequestInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequestOutput;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public class SalExperimenterMpMessageServiceImpl implements SalExperimenterMpMessageService {
+public final class SendExperimenterMpRequestImpl implements SendExperimenterMpRequest {
private final MultiLayerExperimenterMultipartService multiLayerService;
private final SingleLayerExperimenterMultipartService singleLayerService;
- public SalExperimenterMpMessageServiceImpl(final RequestContextStack requestContextStack,
+ public SendExperimenterMpRequestImpl(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
final ExtensionConverterProvider extensionConverterProvider) {
- this.singleLayerService = new SingleLayerExperimenterMultipartService(requestContextStack, deviceContext,
+ singleLayerService = new SingleLayerExperimenterMultipartService(requestContextStack, deviceContext,
extensionConverterProvider);
- this.multiLayerService = new MultiLayerExperimenterMultipartService(requestContextStack, deviceContext,
+ multiLayerService = new MultiLayerExperimenterMultipartService(requestContextStack, deviceContext,
extensionConverterProvider);
}
@Override
- public ListenableFuture<RpcResult<SendExperimenterMpRequestOutput>>
- sendExperimenterMpRequest(SendExperimenterMpRequestInput input) {
+ public ListenableFuture<RpcResult<SendExperimenterMpRequestOutput>> invoke(
+ final SendExperimenterMpRequestInput input) {
return singleLayerService.canUseSingleLayerSerialization()
? singleLayerService.handleAndReply(input)
: multiLayerService.handleAndReply(input);
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.yang.gen.v1.urn.opendaylight.module.config.rev141015.NodeConfigService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfig;
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.SetConfigInputBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public final class NodeConfigServiceImpl extends AbstractSimpleService<SetConfigInput, SetConfigOutput>
- implements NodeConfigService {
- public NodeConfigServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
+public final class SetConfigImpl extends AbstractSimpleService<SetConfigInput, SetConfigOutput> implements SetConfig {
+ public SetConfigImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
super(requestContextStack, deviceContext, SetConfigOutput.class);
}
@Override
- public ListenableFuture<RpcResult<SetConfigOutput>> setConfig(final SetConfigInput input) {
+ public ListenableFuture<RpcResult<SetConfigOutput>> invoke(final SetConfigInput input) {
return handleServiceCall(input);
}
@Override
protected OfHeader buildRequest(final Xid xid, final SetConfigInput input) {
- SetConfigInputBuilder builder = new SetConfigInputBuilder();
- SwitchConfigFlag flag = SwitchConfigFlag.valueOf(input.getFlag());
-
- builder.setXid(xid.getValue());
- builder.setFlags(flag);
- builder.setMissSendLen(input.getMissSearchLength());
- builder.setVersion(getVersion());
- return builder.build();
+ return new SetConfigInputBuilder()
+ .setXid(xid.getValue())
+ // FIXME: this conversion relies on Binding's Java names -- i.e. different from SwitchConfigFlag.forName()!
+ .setFlags(SwitchConfigFlag.valueOf(input.getFlag()))
+ .setMissSendLen(input.getMissSearchLength())
+ .setVersion(getVersion())
+ .build();
}
}
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
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.TransmitPacket;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketOutput;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public final class PacketProcessingServiceImpl extends AbstractSimpleService<TransmitPacketInput, TransmitPacketOutput>
- implements PacketProcessingService {
-
+public final class TransmitPacketImpl extends AbstractSimpleService<TransmitPacketInput, TransmitPacketOutput>
+ implements TransmitPacket {
private final ConvertorExecutor convertorExecutor;
- public PacketProcessingServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor) {
+ public TransmitPacketImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
super(requestContextStack, deviceContext, TransmitPacketOutput.class);
this.convertorExecutor = convertorExecutor;
}
@Override
- public ListenableFuture<RpcResult<TransmitPacketOutput>> transmitPacket(final TransmitPacketInput input) {
+ public ListenableFuture<RpcResult<TransmitPacketOutput>> invoke(final TransmitPacketInput input) {
return handleServiceCall(input);
}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import com.google.common.util.concurrent.SettableFuture;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+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.impl.registry.flow.FlowDescriptorFactory;
+import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
+import org.opendaylight.openflowplugin.impl.util.FlowCreatorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
+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.flow.types.rev131026.FlowRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.yang.common.Uint8;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateFlowImpl extends AbstractFlowRpc<UpdateFlowOutput> implements UpdateFlow {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateFlowImpl.class);
+
+ public UpdateFlowImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, UpdateFlowOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateFlowOutput>> invoke(final UpdateFlowInput input) {
+ final var updated = input.getUpdatedFlow();
+ final var original = input.getOriginalFlow();
+ final var allFlowMods = new ArrayList<FlowModInputBuilder>();
+ final List<FlowModInputBuilder> ofFlowModInputs;
+
+ ListenableFuture<RpcResult<UpdateFlowOutput>> future;
+ if (single.canUseSingleLayerSerialization()) {
+
+ if (!FlowCreatorUtil.canModifyFlow(original, updated, single.getVersion())) {
+ final var objectSettableFuture = SettableFuture.<RpcResult<UpdateFlowOutput>>create();
+ final var listListenableFuture = Futures.successfulAsList(
+ single.handleServiceCall(input.getOriginalFlow()),
+ single.handleServiceCall(input.getUpdatedFlow()));
+
+ Futures.addCallback(listListenableFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final List<RpcResult<UpdateFlowOutput>> results) {
+ final var errors = new ArrayList<RpcError>();
+ for (var flowModResult : results) {
+ if (flowModResult == null) {
+ errors.add(RpcResultBuilder.newError(
+ ErrorType.PROTOCOL, OFConstants.APPLICATION_TAG,
+ "unexpected flowMod result (null) occurred"));
+ } else if (!flowModResult.isSuccessful()) {
+ errors.addAll(flowModResult.getErrors());
+ }
+ }
+
+ final var rpcResultBuilder = errors.isEmpty() ? RpcResultBuilder.<UpdateFlowOutput>success()
+ : RpcResultBuilder.<UpdateFlowOutput>failed().withRpcErrors(errors);
+
+ objectSettableFuture.set(rpcResultBuilder.build());
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ objectSettableFuture.set(RpcResultBuilder.<UpdateFlowOutput>failed().build());
+ }
+ }, MoreExecutors.directExecutor());
+
+ future = objectSettableFuture;
+ } else {
+ future = single.handleServiceCall(input.getUpdatedFlow());
+ }
+ } else {
+ if (!FlowCreatorUtil.canModifyFlow(original, updated, multi.getVersion())) {
+ // We would need to remove original and add updated.
+
+ // remove flow
+ final RemoveFlowInputBuilder removeflow = new RemoveFlowInputBuilder(original);
+ final List<FlowModInputBuilder> ofFlowRemoveInput = multi.toFlowModInputs(removeflow.build());
+ // remove flow should be the first
+ allFlowMods.addAll(ofFlowRemoveInput);
+ final AddFlowInputBuilder addFlowInputBuilder = new AddFlowInputBuilder(updated);
+ ofFlowModInputs = multi.toFlowModInputs(addFlowInputBuilder.build());
+ } else {
+ ofFlowModInputs = multi.toFlowModInputs(updated);
+ }
+
+ allFlowMods.addAll(ofFlowModInputs);
+
+ future = multi.processFlowModInputBuilders(allFlowMods);
+ }
+
+ Futures.addCallback(future, new UpdateFlowCallback(input), MoreExecutors.directExecutor());
+ return future;
+ }
+
+
+ private final class UpdateFlowCallback implements FutureCallback<RpcResult<UpdateFlowOutput>> {
+ private final UpdateFlowInput input;
+
+ private UpdateFlowCallback(final UpdateFlowInput input) {
+ this.input = input;
+ }
+
+ @Override
+ public void onSuccess(final RpcResult<UpdateFlowOutput> updateFlowOutputRpcResult) {
+ final DeviceFlowRegistry deviceFlowRegistry = deviceContext.getDeviceFlowRegistry();
+ final UpdatedFlow updated = input.getUpdatedFlow();
+ final OriginalFlow original = input.getOriginalFlow();
+ final FlowRegistryKey origFlowRegistryKey =
+ FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), original);
+ final FlowRegistryKey updatedFlowRegistryKey =
+ FlowRegistryKeyFactory.create(deviceContext.getDeviceInfo().getVersion(), updated);
+ final FlowDescriptor origFlowDescriptor = deviceFlowRegistry.retrieveDescriptor(origFlowRegistryKey);
+
+ final boolean isUpdate = origFlowDescriptor != null;
+ final FlowDescriptor updatedFlowDescriptor;
+ final FlowRef flowRef = input.getFlowRef();
+ if (flowRef != null) {
+ final Uint8 tableId = updated.getTableId();
+ final FlowId flowId = flowRef.getValue().firstKeyOf(Flow.class).getId();
+ // FIXME: this does not look right, we probably want better integration
+ deviceFlowRegistry.appendHistoryFlow(flowId, tableId, FlowGroupStatus.MODIFIED);
+
+ updatedFlowDescriptor = FlowDescriptorFactory.create(tableId, flowId);
+ } else if (isUpdate) {
+ updatedFlowDescriptor = origFlowDescriptor;
+ } else {
+ deviceFlowRegistry.store(updatedFlowRegistryKey);
+ updatedFlowDescriptor = deviceFlowRegistry.retrieveDescriptor(updatedFlowRegistryKey);
+ }
+
+ if (isUpdate) {
+ deviceFlowRegistry.addMark(origFlowRegistryKey);
+ deviceFlowRegistry.storeDescriptor(updatedFlowRegistryKey, updatedFlowDescriptor);
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for updating flow={} failed", input, throwable);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.FlowUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowInputUpdateGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateFlowsBatchImpl implements UpdateFlowsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateFlowsBatchImpl.class);
+
+ private final UpdateFlow updateFlow;
+ private final SendBarrier sendBarrier;
+
+ public UpdateFlowsBatchImpl(final UpdateFlow updateFlow, final SendBarrier sendBarrier) {
+ this.updateFlow = requireNonNull(updateFlow);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateFlowsBatchOutput>> invoke(final UpdateFlowsBatchInput input) {
+ final var flows = input.nonnullBatchUpdateFlows().values();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Updating flows @ {} : {}", PathUtil.extractNodeId(input.getNode()), flows.size());
+ }
+
+ final var resultsLot = flows.stream()
+ .map(batchFlow -> updateFlow.invoke(new UpdateFlowInputBuilder(input)
+ .setOriginalFlow(new OriginalFlowBuilder(batchFlow.getOriginalBatchedFlow()).build())
+ .setUpdatedFlow(new UpdatedFlowBuilder(batchFlow.getUpdatedBatchedFlow()).build())
+ .setFlowRef(createFlowRef(input.getNode(), batchFlow))
+ .setNode(input.getNode())
+ .build()))
+ .toList();
+
+ final var commonResult = Futures.transform(Futures.successfulAsList(resultsLot),
+ FlowUtil.createCumulatingFunction(flows), MoreExecutors.directExecutor());
+ final var updateFlowsBulkFuture = Futures.transform(commonResult, FlowUtil.FLOW_UPDATE_TRANSFORM,
+ MoreExecutors.directExecutor());
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(updateFlowsBulkFuture, input.getNode(), sendBarrier,
+ FlowUtil.FLOW_UPDATE_COMPOSING_TRANSFORM)
+ : updateFlowsBulkFuture;
+ }
+
+ private static FlowRef createFlowRef(final NodeRef nodeRef, final BatchFlowInputUpdateGrouping batchFlow) {
+ return FlowUtil.buildFlowPath((InstanceIdentifier<Node>) nodeRef.getValue(),
+ batchFlow.getOriginalBatchedFlow().getTableId(), batchFlow.getFlowId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.FlowGroupStatus;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroup;
+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.service.rev130918.group.update.UpdatedGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateGroupImpl extends AbstractGroupRpc<Group, UpdateGroupOutput> implements UpdateGroup {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateGroupImpl.class);
+
+ public UpdateGroupImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, UpdateGroupOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateGroupOutput>> invoke(final UpdateGroupInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization()
+ ? single.handleServiceCall(input.getUpdatedGroup())
+ : multi.handleServiceCall(input.getUpdatedGroup());
+
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<UpdateGroupOutput> result) {
+ if (result.isSuccessful()) {
+ UpdatedGroup updatedGroup = input.getUpdatedGroup();
+ deviceContext.getDeviceGroupRegistry().appendHistoryGroup(
+ updatedGroup.getGroupId(), updatedGroup.getGroupType(), FlowGroupStatus.MODIFIED);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Group update with original id={} finished without error",
+ input.getOriginalGroup().getGroupId().getValue());
+ }
+ } else {
+ LOG.warn("Group update with original id={} failed, errors={}",
+ input.getOriginalGroup().getGroupId(), ErrorUtil.errorsToString(result.getErrors()));
+ LOG.debug("Group input={}", input.getUpdatedGroup());
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for updating group={} failed", input.getOriginalGroup().getGroupId(), throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.GroupUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.BatchGroupInputUpdateGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateGroupsBatchImpl implements UpdateGroupsBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateGroupsBatchImpl.class);
+
+ private final UpdateGroup updateGroup;
+ private final SendBarrier sendBarrier;
+
+ public UpdateGroupsBatchImpl(final UpdateGroup updateGroup, final SendBarrier sendBarrier) {
+ this.updateGroup = requireNonNull(updateGroup);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateGroupsBatchOutput>> invoke(final UpdateGroupsBatchInput input) {
+ final var batchUpdateGroups = input.nonnullBatchUpdateGroups();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Updating groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateGroups.size());
+ }
+
+ final var resultsLot = batchUpdateGroups.stream()
+ .map(batchGroup -> updateGroup.invoke(new UpdateGroupInputBuilder(input)
+ .setOriginalGroup(new OriginalGroupBuilder(batchGroup.getOriginalBatchedGroup()).build())
+ .setUpdatedGroup(new UpdatedGroupBuilder(batchGroup.getUpdatedBatchedGroup()).build())
+ .setGroupRef(createGroupRef(input.getNode(), batchGroup))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var groups = batchUpdateGroups.stream()
+ .map(BatchGroupInputUpdateGrouping::getUpdatedBatchedGroup)
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ GroupUtil.createCumulatingFunction(groups, batchUpdateGroups.size()),
+ MoreExecutors.directExecutor());
+
+ final var updateGroupsBulkFuture = Futures.transform(commonResult, GroupUtil.GROUP_UPDATE_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(updateGroupsBulkFuture, input.getNode(), sendBarrier,
+ GroupUtil.GROUP_UPDATE_COMPOSING_TRANSFORM)
+ : updateGroupsBulkFuture;
+ }
+
+ private static GroupRef createGroupRef(final NodeRef nodeRef, final BatchUpdateGroups batchGroup) {
+ return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(),
+ batchGroup.getUpdatedBatchedGroup().getGroupId());
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o.
+ *
+ * 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.sal;
+
+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.MoreExecutors;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.util.ErrorUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
+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.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateMeterImpl extends AbstractMeterRpc<Meter, UpdateMeterOutput> implements UpdateMeter {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateMeterImpl.class);
+
+ public UpdateMeterImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor) {
+ super(requestContextStack, deviceContext, convertorExecutor, UpdateMeterOutput.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateMeterOutput>> invoke(final UpdateMeterInput input) {
+ final var resultFuture = single.canUseSingleLayerSerialization()
+ ? single.handleServiceCall(input.getUpdatedMeter())
+ : multi.handleServiceCall(input.getUpdatedMeter());
+
+ Futures.addCallback(resultFuture, new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<UpdateMeterOutput> result) {
+ if (result.isSuccessful()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Meter update with id={} finished without error",
+ input.getOriginalMeter().getMeterId());
+ }
+ } else {
+ LOG.warn("Meter update with id={} failed, errors={}", input.getOriginalMeter().getMeterId(),
+ ErrorUtil.errorsToString(result.getErrors()));
+ LOG.debug("Meter input={}", input.getUpdatedMeter());
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Service call for updating meter={} failed", input.getOriginalMeter().getMeterId(), throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ return resultFuture;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.sal;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
+import org.opendaylight.openflowplugin.impl.util.MeterUtil;
+import org.opendaylight.openflowplugin.impl.util.PathUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterInputUpdateGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class UpdateMetersBatchImpl implements UpdateMetersBatch {
+ private static final Logger LOG = LoggerFactory.getLogger(UpdateMetersBatchImpl.class);
+
+ private final UpdateMeter updateMeter;
+ private final SendBarrier sendBarrier;
+
+ public UpdateMetersBatchImpl(final UpdateMeter updateMeter, final SendBarrier sendBarrier) {
+ this.updateMeter = requireNonNull(updateMeter);
+ this.sendBarrier = requireNonNull(sendBarrier);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateMetersBatchOutput>> invoke(final UpdateMetersBatchInput input) {
+ final var batchUpdateMeters = input.nonnullBatchUpdateMeters();
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Updating meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateMeters.size());
+ }
+
+ final var resultsLot = batchUpdateMeters.stream()
+ .map(batchMeter -> updateMeter.invoke(new UpdateMeterInputBuilder(input)
+ .setOriginalMeter(new OriginalMeterBuilder(batchMeter.getOriginalBatchedMeter()).build())
+ .setUpdatedMeter(new UpdatedMeterBuilder(batchMeter.getUpdatedBatchedMeter()).build())
+ .setMeterRef(createMeterRef(input.getNode(), batchMeter))
+ .setNode(input.getNode())
+ .build()))
+ .collect(Collectors.toList());
+
+ final var meters = batchUpdateMeters.stream()
+ .map(BatchMeterInputUpdateGrouping::getUpdatedBatchedMeter)
+ .collect(Collectors.toList());
+
+ final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
+ MeterUtil.createCumulativeFunction(meters, batchUpdateMeters.size()), MoreExecutors.directExecutor());
+
+ final var updateMetersBulkFuture = Futures.transform(commonResult, MeterUtil.METER_UPDATE_TRANSFORM,
+ MoreExecutors.directExecutor());
+
+ return input.getBarrierAfter()
+ ? BarrierUtil.chainBarrier(updateMetersBulkFuture, input.getNode(), sendBarrier,
+ MeterUtil.METER_UPDATE_COMPOSING_TRANSFORM)
+ : updateMetersBulkFuture;
+ }
+
+ private static MeterRef createMeterRef(final NodeRef nodeRef, final BatchUpdateMeters batchMeter) {
+ return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(),
+ batchMeter.getUpdatedBatchedMeter().getMeterId());
+ }
+}
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.SalPortService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePort;
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.RpcResult;
-public final class SalPortServiceImpl
- extends AbstractSimpleService<UpdatePortInput, UpdatePortOutput> implements SalPortService {
+public final class UpdatePortImpl extends AbstractSimpleService<UpdatePortInput, UpdatePortOutput>
+ implements UpdatePort {
private final ConvertorExecutor convertorExecutor;
private final VersionConvertorData data;
private final SingleLayerPortService<UpdatePortOutput> portMessage;
- public SalPortServiceImpl(final RequestContextStack requestContextStack,
+ public UpdatePortImpl(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
final ConvertorExecutor convertorExecutor) {
super(requestContextStack, deviceContext, UpdatePortOutput.class);
}
@Override
- public ListenableFuture<RpcResult<UpdatePortOutput>> updatePort(final UpdatePortInput input) {
+ public ListenableFuture<RpcResult<UpdatePortOutput>> invoke(final UpdatePortInput input) {
return portMessage.canUseSingleLayerSerialization()
? portMessage.handleServiceCall(getPortFromInput(input))
: handleServiceCall(input);
@Override
protected OfHeader buildRequest(final Xid xid, final UpdatePortInput input) {
- final Optional<PortModInput> ofPortModInput = convertorExecutor
- .convert(getPortFromInput(input), data);
+ final Optional<PortModInput> ofPortModInput = convertorExecutor.convert(getPortFromInput(input), data);
- final PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput
- .orElse(PortConvertor.defaultResult(getVersion())))
- .setXid(xid.getValue());
-
- return mdInput.build();
+ return new PortModInputBuilder(ofPortModInput.orElse(PortConvertor.defaultResult(getVersion())))
+ .setXid(xid.getValue())
+ .build();
}
private static Port getPortFromInput(final UpdatePortInput input) {
import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerTableMultipartService;
import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerTableMultipartService;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTable;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public final class SalTableServiceImpl implements SalTableService {
-
+public final class UpdateTableImpl implements UpdateTable {
private final SingleLayerTableMultipartService singleLayerService;
private final MultiLayerTableMultipartService multiLayerService;
- public SalTableServiceImpl(final RequestContextStack requestContextStack,
+ public UpdateTableImpl(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
final ConvertorExecutor convertorExecutor,
final MultipartWriterProvider multipartWriterProvider) {
- singleLayerService = new SingleLayerTableMultipartService(requestContextStack,
- deviceContext,
- multipartWriterProvider);
- multiLayerService = new MultiLayerTableMultipartService(requestContextStack,
- deviceContext,
- convertorExecutor,
- multipartWriterProvider);
+ singleLayerService = new SingleLayerTableMultipartService(requestContextStack, deviceContext,
+ multipartWriterProvider);
+ multiLayerService = new MultiLayerTableMultipartService(requestContextStack, deviceContext, convertorExecutor,
+ multipartWriterProvider);
}
@Override
- public ListenableFuture<RpcResult<UpdateTableOutput>> updateTable(final UpdateTableInput input) {
+ public ListenableFuture<RpcResult<UpdateTableOutput>> invoke(final UpdateTableInput input) {
return singleLayerService.canUseSingleLayerSerialization()
? singleLayerService.handleAndReply(input)
: multiLayerService.handleAndReply(input);
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.singlelayer;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+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.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.AsyncConfigMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsync;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInputBuilder;
+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;
+
+public final class GetAsyncImpl extends AbstractSimpleService<GetAsyncInput, AsyncConfigMessage> implements GetAsync {
+ public GetAsyncImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) {
+ super(requestContextStack, deviceContext, AsyncConfigMessage.class);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAsyncOutput>> invoke(final GetAsyncInput input) {
+ return Futures.transform(handleServiceCall(input), result ->
+ result != null && result.isSuccessful()
+ ? RpcResultBuilder.success(new GetAsyncOutputBuilder(result.getResult()).build()).build()
+ : RpcResultBuilder.<GetAsyncOutput>failed().build(),
+ MoreExecutors.directExecutor());
+ }
+
+ @Override
+ protected OfHeader buildRequest(final Xid xid, final GetAsyncInput input) {
+ return new GetAsyncInputBuilder().setVersion(getVersion()).setXid(xid.getValue()).build();
+ }
+}
\ No newline at end of file
* 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.singlelayer;
+import com.google.common.util.concurrent.ListenableFuture;
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.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.AsyncConfigMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsync;
import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
-public class SingleLayerSetAsyncConfigService extends AbstractSimpleService<SetAsyncInput, SetAsyncOutput> {
-
- public SingleLayerSetAsyncConfigService(final RequestContextStack requestContextStack,
+public final class SetAsyncImpl extends AbstractSimpleService<SetAsyncInput, SetAsyncOutput> implements SetAsync {
+ public SetAsyncImpl(final RequestContextStack requestContextStack,
final DeviceContext deviceContext) {
super(requestContextStack, deviceContext, SetAsyncOutput.class);
}
@Override
- protected OfHeader buildRequest(Xid xid, SetAsyncInput input) {
+ public ListenableFuture<RpcResult<SetAsyncOutput>> invoke(final SetAsyncInput input) {
+ return handleServiceCall(input);
+ }
+
+ @Override
+ protected OfHeader buildRequest(final Xid xid, final SetAsyncInput input) {
return new AsyncConfigMessageBuilder(input)
.setVersion(getVersion())
.setXid(xid.getValue())
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.singlelayer;
-
-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.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.AsyncConfigMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
-
-public class SingleLayerGetAsyncConfigService extends AbstractSimpleService<GetAsyncInput, AsyncConfigMessage> {
-
- public SingleLayerGetAsyncConfigService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext) {
- super(requestContextStack, deviceContext, AsyncConfigMessage.class);
- }
-
- @Override
- protected OfHeader buildRequest(Xid xid, GetAsyncInput input) {
- return new GetAsyncInputBuilder().setVersion(getVersion()).setXid(xid.getValue()).build();
- }
-}
\ No newline at end of file
AbstractCompatibleStatService<GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput,
GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput,
AggregateFlowStatisticsUpdate> {
-
- final TranslatorLibrary translatorLibrary;
-
- public static AggregateFlowsInTableService createWithOook(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed) {
- return new AggregateFlowsInTableService(requestContextStack,
- deviceContext,
- compatibilityXidSeed,
- deviceContext.oook());
- }
+ private final TranslatorLibrary translatorLibrary;
public AggregateFlowsInTableService(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed,
- final TranslatorLibrary translatorLibrary) {
+ final AtomicLong compatibilityXidSeed) {
super(requestContextStack, deviceContext, compatibilityXidSeed);
-
- this.translatorLibrary = translatorLibrary;
+ translatorLibrary = deviceContext.oook();
}
@Override
private final ConvertorExecutor convertorExecutor;
-
AllGroupsStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
final AtomicLong compatibilityXidSeed, final ConvertorExecutor convertorExecutor) {
super(requestContextStack, deviceContext, compatibilityXidSeed);
@Override
public GroupStatisticsUpdated transformToNotification(final List<MultipartReply> result,
final TransactionId emulatedTxId) {
- return GroupStatisticsToNotificationTransformer.transformToNotification(result,
- getDeviceInfo(),
- emulatedTxId,
- convertorExecutor);
+ return GroupStatisticsToNotificationTransformer.transformToNotification(result, getDeviceInfo(), emulatedTxId,
+ convertorExecutor);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.util.concurrent.ListenableFuture;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerAggregateFlowMultipartService;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerAggregateFlowMultipartService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+public final class GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl
+ implements GetAggregateFlowStatisticsFromFlowTableForGivenMatch {
+ private final SingleLayerAggregateFlowMultipartService single;
+ private final MultiLayerAggregateFlowMultipartService multi;
+
+ public GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor) {
+ single = new SingleLayerAggregateFlowMultipartService(requestContextStack, deviceContext);
+ multi = new MultiLayerAggregateFlowMultipartService(requestContextStack, deviceContext,
+ convertorExecutor, deviceContext.oook());
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> invoke(
+ final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
+ return single.canUseSingleLayerSerialization() ? single.handleAndReply(input) : multi.handleAndReply(input);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllGroupStatisticsImpl implements GetAllGroupStatistics {
+ private final NotificationPublishService notificationPublishService;
+ private final @NonNull AllGroupsStatsService allGroups;
+
+ public GetAllGroupStatisticsImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService, final ConvertorExecutor convertorExecutor) {
+ this.notificationPublishService = notificationPublishService;
+ allGroups = new AllGroupsStatsService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllGroupStatisticsOutput>> invoke(final GetAllGroupStatisticsInput input) {
+ return allGroups.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllMeterConfigStatisticsImpl implements GetAllMeterConfigStatistics {
+ private final NotificationPublishService notificationPublishService;
+ private final AllMeterConfigStatsService allMeterConfig;
+
+ public GetAllMeterConfigStatisticsImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService, final ConvertorExecutor convertorExecutor) {
+ allMeterConfig = new AllMeterConfigStatsService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> invoke(
+ final GetAllMeterConfigStatisticsInput input) {
+ return allMeterConfig.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllMeterStatisticsImpl implements GetAllMeterStatistics {
+ private final NotificationPublishService notificationPublishService;
+ private final AllMeterStatsService allMeterStats;
+
+ public GetAllMeterStatisticsImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ allMeterStats = new AllMeterStatsService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllMeterStatisticsOutput>> invoke(final GetAllMeterStatisticsInput input) {
+ return allMeterStats.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllNodeConnectorsStatisticsImpl implements GetAllNodeConnectorsStatistics {
+ private final AllPortStatsService allPortStats;
+ private final NotificationPublishService notificationPublishService;
+
+ public GetAllNodeConnectorsStatisticsImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService) {
+ allPortStats = new AllPortStatsService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> invoke(
+ final GetAllNodeConnectorsStatisticsInput input) {
+ return allPortStats.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPorts;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllQueuesStatisticsFromAllPortsImpl implements GetAllQueuesStatisticsFromAllPorts {
+ private final NotificationPublishService notificationPublishService;
+ private final AllQueuesAllPortsService allQueuesAllPorts;
+
+ public GetAllQueuesStatisticsFromAllPortsImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService) {
+ allQueuesAllPorts = new AllQueuesAllPortsService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> invoke(
+ final GetAllQueuesStatisticsFromAllPortsInput input) {
+ return allQueuesAllPorts.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllQueuesStatisticsFromGivenPortImpl implements GetAllQueuesStatisticsFromGivenPort {
+ private final NotificationPublishService notificationPublishService;
+ private final AllQueuesOnePortService allQueuesOnePort;
+
+ public GetAllQueuesStatisticsFromGivenPortImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService) {
+ allQueuesOnePort = new AllQueuesOnePortService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> invoke(
+ final GetAllQueuesStatisticsFromGivenPortInput input) {
+ return allQueuesOnePort.handleAndNotify(input, notificationPublishService);
+ }
+}
*/
package org.opendaylight.openflowplugin.impl.statistics.services;
+import static java.util.Objects.requireNonNull;
+
import com.google.common.util.concurrent.ListenableFuture;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdate;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public final class OpendaylightFlowTableStatisticsServiceImpl extends
- AbstractCompatibleStatService<GetFlowTablesStatisticsInput,
- GetFlowTablesStatisticsOutput,
- FlowTableStatisticsUpdate> implements
- OpendaylightFlowTableStatisticsService {
-
+@Deprecated
+public final class GetFlowTablesStatisticsImpl
+ extends AbstractCompatibleStatService<GetFlowTablesStatisticsInput, GetFlowTablesStatisticsOutput,
+ FlowTableStatisticsUpdate>
+ implements GetFlowTablesStatistics {
private final NotificationPublishService notificationPublishService;
- public OpendaylightFlowTableStatisticsServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed,
- final NotificationPublishService notificationPublishService) {
+ public GetFlowTablesStatisticsImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService) {
super(requestContextStack, deviceContext, compatibilityXidSeed);
- this.notificationPublishService = notificationPublishService;
+ this.notificationPublishService = requireNonNull(notificationPublishService);
}
@Override
- public ListenableFuture<RpcResult<GetFlowTablesStatisticsOutput>> getFlowTablesStatistics(
- final GetFlowTablesStatisticsInput input) {
+ public ListenableFuture<RpcResult<GetFlowTablesStatisticsOutput>> invoke(final GetFlowTablesStatisticsInput input) {
return handleAndNotify(input, notificationPublishService);
}
@Override
protected OfHeader buildRequest(final Xid xid, final GetFlowTablesStatisticsInput input) {
- // Create multipart request body for fetch all the group stats
- final MultipartRequestTableCaseBuilder multipartRequestTableCaseBuilder =
- new MultipartRequestTableCaseBuilder();
- final MultipartRequestTableBuilder multipartRequestTableBuilder = new MultipartRequestTableBuilder();
- multipartRequestTableBuilder.setEmpty(Empty.value());
- multipartRequestTableCaseBuilder.setMultipartRequestTable(multipartRequestTableBuilder.build());
-
// Set request body to main multipart request
- final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
- MultipartType.OFPMPTABLE, xid.getValue(), getVersion());
-
- mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build());
-
- return mprInput.build();
+ return RequestInputUtils.createMultipartHeader(MultipartType.OFPMPTABLE, xid.getValue(), getVersion())
+ // Create multipart request body for fetch all the group stats
+ .setMultipartRequestBody(new MultipartRequestTableCaseBuilder()
+ .setMultipartRequestTable(new MultipartRequestTableBuilder()
+ .setEmpty(Empty.value())
+ .build())
+ .build())
+ .build();
}
@Override
@Override
public FlowTableStatisticsUpdate transformToNotification(final List<MultipartReply> mpReplyList,
final TransactionId emulatedTxId) {
- FlowTableStatisticsUpdateBuilder notification = new FlowTableStatisticsUpdateBuilder();
- notification.setId(getDeviceInfo().getNodeId());
- notification.setMoreReplies(Boolean.FALSE);
- notification.setTransactionId(emulatedTxId);
+ final var notification = new FlowTableStatisticsUpdateBuilder()
+ .setId(getDeviceInfo().getNodeId())
+ .setMoreReplies(Boolean.FALSE)
+ .setTransactionId(emulatedTxId);
final var salFlowStats = BindingMap.<FlowTableAndStatisticsMapKey, FlowTableAndStatisticsMap>orderedBuilder();
- for (MultipartReply mpReply : mpReplyList) {
- MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
- MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
+ for (var mpReply : mpReplyList) {
+ final var caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
//TODO: Duplicate code: look at MultiReplyTranslatorUtil method translateTable
- for (TableStats swTableStats : replyBody.nonnullTableStats()) {
- FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
- statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
- statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
- statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
- statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
- salFlowStats.add(statisticsBuilder.build());
+ for (var swTableStats : caseBody.getMultipartReplyTable().nonnullTableStats()) {
+ salFlowStats.add(new FlowTableAndStatisticsMapBuilder()
+ .setActiveFlows(new Counter32(swTableStats.getActiveCount()))
+ .setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()))
+ .setPacketsMatched(new Counter64(swTableStats.getMatchedCount()))
+ .setTableId(new TableId(swTableStats.getTableId()))
+ .build());
}
}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescription;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetGroupDescriptionImpl implements GetGroupDescription {
+ private final GroupDescriptionService groupDesc;
+ private final NotificationPublishService notificationPublishService;
+
+ public GetGroupDescriptionImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ groupDesc = new GroupDescriptionService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetGroupDescriptionOutput>> invoke(final GetGroupDescriptionInput input) {
+ return groupDesc.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeatures;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetGroupFeaturesImpl implements GetGroupFeatures {
+ private final GroupFeaturesService groupFeat;
+ private final NotificationPublishService notificationPublishService;
+
+ public GetGroupFeaturesImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ groupFeat = new GroupFeaturesService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetGroupFeaturesOutput>> invoke(final GetGroupFeaturesInput input) {
+ return groupFeat.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * 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.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetGroupStatisticsImpl implements GetGroupStatistics {
+ private final GroupStatsService groupStats;
+ private final NotificationPublishService notificationPublishService;
+
+ public GetGroupStatisticsImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ this.notificationPublishService = notificationPublishService;
+ groupStats = new GroupStatsService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> invoke(final GetGroupStatisticsInput input) {
+ return groupStats.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeatures;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetMeterFeaturesImpl implements GetMeterFeatures {
+ private final NotificationPublishService notificationPublishService;
+ private final MeterFeaturesService meterFeatures;
+
+ public GetMeterFeaturesImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ meterFeatures = new MeterFeaturesService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetMeterFeaturesOutput>> invoke(final GetMeterFeaturesInput input) {
+ return meterFeatures.handleAndNotify(input, notificationPublishService);
+ }
+}
--- /dev/null
+/*
+ * 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatistics;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetMeterStatisticsImpl implements GetMeterStatistics {
+ private final NotificationPublishService notificationPublishService;
+ private final MeterStatsService meterStats;
+
+ public GetMeterStatisticsImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationPublishService,
+ final ConvertorExecutor convertorExecutor) {
+ meterStats = new MeterStatsService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> invoke(final GetMeterStatisticsInput input) {
+ return meterStats.handleAndNotify(input, notificationPublishService);
+ }
+}
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.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.GetNodeConnectorStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService;
import org.opendaylight.yangtools.yang.common.RpcResult;
-public class OpendaylightPortStatisticsServiceImpl implements OpendaylightPortStatisticsService {
- private final AllPortStatsService allPortStats;
+@Deprecated
+public final class GetNodeConnectorStatisticsImpl implements GetNodeConnectorStatistics {
private final PortStatsService portStats;
private final NotificationPublishService notificationPublishService;
- public OpendaylightPortStatisticsServiceImpl(final RequestContextStack requestContextStack,
+ public GetNodeConnectorStatisticsImpl(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
final AtomicLong compatibilityXidSeed,
final NotificationPublishService notificationPublishService) {
this.notificationPublishService = notificationPublishService;
- allPortStats = new AllPortStatsService(requestContextStack, deviceContext, compatibilityXidSeed);
portStats = new PortStatsService(requestContextStack, deviceContext, compatibilityXidSeed);
}
@Override
- public ListenableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> getAllNodeConnectorsStatistics(
- final GetAllNodeConnectorsStatisticsInput input) {
- return allPortStats.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> getNodeConnectorStatistics(
+ public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> invoke(
final GetNodeConnectorStatisticsInput input) {
return portStats.handleAndNotify(input, notificationPublishService);
}
--- /dev/null
+/*
+ * 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 static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetQueueStatisticsFromGivenPortImpl implements GetQueueStatisticsFromGivenPort {
+ private final OneQueueOnePortService oneQueueOnePort;
+ private final NotificationPublishService notificationPublishService;
+
+ public GetQueueStatisticsFromGivenPortImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final AtomicLong compatibilityXidSeed,
+ final NotificationPublishService notificationPublishService) {
+ oneQueueOnePort = new OneQueueOnePortService(requestContextStack, deviceContext, compatibilityXidSeed);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> invoke(
+ final GetQueueStatisticsFromGivenPortInput input) {
+ return oneQueueOnePort.handleAndNotify(input, notificationPublishService);
+ }
+}
+++ /dev/null
-/*
- * 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.util.concurrent.ListenableFuture;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
-import org.opendaylight.openflowplugin.api.openflow.statistics.compatibility.Delegator;
-import org.opendaylight.openflowplugin.impl.services.multilayer.MultiLayerAggregateFlowMultipartService;
-import org.opendaylight.openflowplugin.impl.services.singlelayer.SingleLayerAggregateFlowMultipartService;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
-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.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
-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.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-
-public class OpendaylightFlowStatisticsServiceImpl implements OpendaylightFlowStatisticsService,
- Delegator<OpendaylightFlowStatisticsService> {
-
- private final SingleLayerAggregateFlowMultipartService singleLayerService;
- private final MultiLayerAggregateFlowMultipartService multiLayerService;
- private OpendaylightFlowStatisticsService delegate;
-
- public static OpendaylightFlowStatisticsServiceImpl createWithOook(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor) {
- return new OpendaylightFlowStatisticsServiceImpl(requestContextStack,
- deviceContext,
- deviceContext.oook(),
- convertorExecutor);
- }
-
- public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final TranslatorLibrary translatorLibrary,
- final ConvertorExecutor convertorExecutor) {
- singleLayerService = new SingleLayerAggregateFlowMultipartService(requestContextStack, deviceContext);
- multiLayerService = new MultiLayerAggregateFlowMultipartService(requestContextStack, deviceContext,
- convertorExecutor, translatorLibrary);
- }
-
- @Override
- public void setDelegate(OpendaylightFlowStatisticsService delegate) {
- this.delegate = delegate;
- }
-
- /**
- * Get aggregate statistics.
- *
- * @deprecated provided for Be-release as backward compatibility relic.
- */
- @Override
- @Deprecated
- public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>>
- getAggregateFlowStatisticsFromFlowTableForAllFlows(
- final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
- if (delegate != null) {
- return delegate.getAggregateFlowStatisticsFromFlowTableForAllFlows(input);
- } else {
- throw new IllegalAccessError("no delegate available - service is currently out of order");
- }
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>>
- getAggregateFlowStatisticsFromFlowTableForGivenMatch(
- final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
- return singleLayerService.canUseSingleLayerSerialization()
- ? singleLayerService.handleAndReply(input)
- : multiLayerService.handleAndReply(input);
- }
-
- /**
- * Get flow statistics.
- *
- * @deprecated provided for Be-release as backward compatibility relic.
- */
- @Override
- @Deprecated
- public ListenableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
- final GetAllFlowStatisticsFromFlowTableInput input) {
- if (delegate != null) {
- return delegate.getAllFlowStatisticsFromFlowTable(input);
- } else {
- throw new IllegalAccessError("no delegate available - service is currently out of order");
- }
- }
-
- /**
- * Get flow statistics.
- *
- * @deprecated provided for Be-release as backward compatibility relic.
- */
- @Override
- @Deprecated
- public ListenableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>>
- getAllFlowsStatisticsFromAllFlowTables(final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
- if (delegate != null) {
- return delegate.getAllFlowsStatisticsFromAllFlowTables(input);
- } else {
- throw new IllegalAccessError("no delegate available - service is currently out of order");
- }
- }
-
- /**
- * Get flow statistics.
- *
- * @deprecated provided for Be-release as backward compatibility relic.
- */
- @Override
- @Deprecated
- public ListenableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
- final GetFlowStatisticsFromFlowTableInput input) {
- if (delegate != null) {
- return delegate.getFlowStatisticsFromFlowTable(input);
- } else {
- throw new IllegalAccessError("no delegate available - service is currently out of order");
- }
- }
-}
+++ /dev/null
-/*
- * 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.util.concurrent.ListenableFuture;
-import java.util.concurrent.atomic.AtomicLong;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
-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.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.yangtools.yang.common.RpcResult;
-
-public class OpendaylightGroupStatisticsServiceImpl implements OpendaylightGroupStatisticsService {
- private final AllGroupsStatsService allGroups;
- private final GroupDescriptionService groupDesc;
- private final GroupFeaturesService groupFeat;
- private final GroupStatsService groupStats;
- private final NotificationPublishService notificationPublishService;
-
- public OpendaylightGroupStatisticsServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed,
- final NotificationPublishService notificationPublishService,
- final ConvertorExecutor convertorExecutor) {
- this.notificationPublishService = notificationPublishService;
- allGroups =
- new AllGroupsStatsService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
- groupDesc = new GroupDescriptionService(requestContextStack,
- deviceContext,
- compatibilityXidSeed,
- convertorExecutor);
- groupFeat = new GroupFeaturesService(requestContextStack, deviceContext, compatibilityXidSeed);
- groupStats = new GroupStatsService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllGroupStatisticsOutput>> getAllGroupStatistics(
- final GetAllGroupStatisticsInput input) {
- return allGroups.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetGroupDescriptionOutput>> getGroupDescription(
- final GetGroupDescriptionInput input) {
- return groupDesc.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetGroupFeaturesOutput>> getGroupFeatures(final GetGroupFeaturesInput input) {
- return groupFeat.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(
- final GetGroupStatisticsInput input) {
- return groupStats.handleAndNotify(input, notificationPublishService);
- }
-}
+++ /dev/null
-/*
- * 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.util.concurrent.ListenableFuture;
-import java.util.concurrent.atomic.AtomicLong;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
-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.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.yangtools.yang.common.RpcResult;
-
-public class OpendaylightMeterStatisticsServiceImpl implements OpendaylightMeterStatisticsService {
- private final AllMeterConfigStatsService allMeterConfig;
- private final AllMeterStatsService allMeterStats;
- private final MeterFeaturesService meterFeatures;
- private final MeterStatsService meterStats;
- private final NotificationPublishService notificationPublishService;
-
- public OpendaylightMeterStatisticsServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed,
- final NotificationPublishService notificationPublishService,
- final ConvertorExecutor convertorExecutor) {
- this.notificationPublishService = notificationPublishService;
-
- allMeterConfig = new AllMeterConfigStatsService(requestContextStack,
- deviceContext,
- compatibilityXidSeed,
- convertorExecutor);
- allMeterStats = new AllMeterStatsService(requestContextStack,
- deviceContext,
- compatibilityXidSeed,
- convertorExecutor);
- meterFeatures = new MeterFeaturesService(requestContextStack, deviceContext, compatibilityXidSeed);
- meterStats = new MeterStatsService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> getAllMeterConfigStatistics(
- final GetAllMeterConfigStatisticsInput input) {
- return allMeterConfig.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllMeterStatisticsOutput>> getAllMeterStatistics(
- final GetAllMeterStatisticsInput input) {
- return allMeterStats.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetMeterFeaturesOutput>> getMeterFeatures(final GetMeterFeaturesInput input) {
- return meterFeatures.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(
- final GetMeterStatisticsInput input) {
- return meterStats.handleAndNotify(input, notificationPublishService);
- }
-}
+++ /dev/null
-/*
- * 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.util.concurrent.ListenableFuture;
-import java.util.concurrent.atomic.AtomicLong;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-
-public class OpendaylightQueueStatisticsServiceImpl implements OpendaylightQueueStatisticsService {
- private final AllQueuesAllPortsService allQueuesAllPorts;
- private final AllQueuesOnePortService allQueuesOnePort;
- private final OneQueueOnePortService oneQueueOnePort;
- private final NotificationPublishService notificationPublishService;
-
- public OpendaylightQueueStatisticsServiceImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed,
- final NotificationPublishService notificationPublishService) {
- this.notificationPublishService = notificationPublishService;
- allQueuesAllPorts = new AllQueuesAllPortsService(requestContextStack, deviceContext, compatibilityXidSeed);
- allQueuesOnePort = new AllQueuesOnePortService(requestContextStack, deviceContext, compatibilityXidSeed);
- oneQueueOnePort = new OneQueueOnePortService(requestContextStack, deviceContext, compatibilityXidSeed);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> getAllQueuesStatisticsFromAllPorts(
- final GetAllQueuesStatisticsFromAllPortsInput input) {
- return allQueuesAllPorts.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> getAllQueuesStatisticsFromGivenPort(
- final GetAllQueuesStatisticsFromGivenPortInput input) {
- return allQueuesOnePort.handleAndNotify(input, notificationPublishService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> getQueueStatisticsFromGivenPort(
- final GetQueueStatisticsFromGivenPortInput input) {
- return oneQueueOnePort.handleAndNotify(input, notificationPublishService);
- }
-}
final class PortStatsService extends AbstractCompatibleStatService<GetNodeConnectorStatisticsInput,
GetNodeConnectorStatisticsOutput,
NodeConnectorStatisticsUpdate> {
-
- PortStatsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final AtomicLong compatibilityXidSeed) {
+ PortStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final AtomicLong compatibilityXidSeed) {
super(requestContextStack, deviceContext, compatibilityXidSeed);
}
@Override
- protected OfHeader buildRequest(final Xid xid,
- final GetNodeConnectorStatisticsInput input) {
- MultipartRequestPortStatsCaseBuilder caseBuilder =
- new MultipartRequestPortStatsCaseBuilder();
- MultipartRequestPortStatsBuilder mprPortStatsBuilder =
- new MultipartRequestPortStatsBuilder();
+ protected OfHeader buildRequest(final Xid xid, final GetNodeConnectorStatisticsInput input) {
+ MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
+ MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
// Set specific port
final Uint8 version = getVersion();
mprPortStatsBuilder
@Override
public NodeConnectorStatisticsUpdate transformToNotification(final List<MultipartReply> result,
final TransactionId emulatedTxId) {
- return NodeConnectorStatisticsToNotificationTransformer.transformToNotification(result,
- getDeviceInfo(),
- getOfVersion(),
- emulatedTxId);
+ return NodeConnectorStatisticsToNotificationTransformer.transformToNotification(result, getDeviceInfo(),
+ getOfVersion(), emulatedTxId);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.compatibility;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.statistics.services.AggregateFlowsInTableService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlows;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl
+ implements GetAggregateFlowStatisticsFromFlowTableForAllFlows {
+ private final AggregateFlowsInTableService aggregateFlowsInTable;
+ private final NotificationPublishService notificationService;
+
+ public GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationService) {
+ aggregateFlowsInTable = new AggregateFlowsInTableService(requestContextStack, deviceContext,
+ compatibilityXidSeed);
+ this.notificationService = requireNonNull(notificationService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> invoke(
+ final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
+ return aggregateFlowsInTable.handleAndNotify(input, notificationService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.compatibility;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.statistics.services.AllFlowsInTableService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTable;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllFlowStatisticsFromFlowTableImpl implements GetAllFlowStatisticsFromFlowTable {
+ private final AllFlowsInTableService allFlowsInTable;
+ private final NotificationPublishService notificationService;
+
+ public GetAllFlowStatisticsFromFlowTableImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationService) {
+ allFlowsInTable = new AllFlowsInTableService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationService = requireNonNull(notificationService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> invoke(
+ final GetAllFlowStatisticsFromFlowTableInput input) {
+ return allFlowsInTable.handleAndNotify(input, notificationService);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.compatibility;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.statistics.services.AllFlowsInAllTablesService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTables;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetAllFlowsStatisticsFromAllFlowTablesImpl implements GetAllFlowsStatisticsFromAllFlowTables {
+ private final NotificationPublishService notificationService;
+ private final AllFlowsInAllTablesService allFlowsInAllTables;
+
+ public GetAllFlowsStatisticsFromAllFlowTablesImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationService) {
+ allFlowsInAllTables = new AllFlowsInAllTablesService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationService = requireNonNull(notificationService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> invoke(
+ final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
+ return allFlowsInAllTables.handleAndNotify(input, notificationService);
+ }
+}
--- /dev/null
+/*
+ * 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.compatibility;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.impl.statistics.services.FlowsInTableService;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTable;
+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.yangtools.yang.common.RpcResult;
+
+@Deprecated
+public final class GetFlowStatisticsFromFlowTableImpl implements GetFlowStatisticsFromFlowTable {
+ private final FlowsInTableService flowsInTable;
+ private final NotificationPublishService notificationService;
+
+ public GetFlowStatisticsFromFlowTableImpl(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final AtomicLong compatibilityXidSeed, final NotificationPublishService notificationService) {
+ flowsInTable = new FlowsInTableService(requestContextStack, deviceContext, compatibilityXidSeed,
+ convertorExecutor);
+ this.notificationService = requireNonNull(notificationService);
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> invoke(
+ final GetFlowStatisticsFromFlowTableInput input) {
+ return flowsInTable.handleAndNotify(input, notificationService);
+ }
+}
+++ /dev/null
-/*
- * 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.compatibility;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.atomic.AtomicLong;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.statistics.services.AggregateFlowsInTableService;
-import org.opendaylight.openflowplugin.impl.statistics.services.AllFlowsInAllTablesService;
-import org.opendaylight.openflowplugin.impl.statistics.services.AllFlowsInTableService;
-import org.opendaylight.openflowplugin.impl.statistics.services.FlowsInTableService;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
-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.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
-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.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class OpendaylightFlowStatisticsServiceDelegateImpl implements OpendaylightFlowStatisticsService {
-
- private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceDelegateImpl.class);
-
- private final AggregateFlowsInTableService aggregateFlowsInTable;
- private final AllFlowsInAllTablesService allFlowsInAllTables;
- private final AllFlowsInTableService allFlowsInTable;
- private final FlowsInTableService flowsInTable;
- private final NotificationPublishService notificationService;
-
- public OpendaylightFlowStatisticsServiceDelegateImpl(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final NotificationPublishService notificationService,
- final AtomicLong compatibilityXidSeed,
- final ConvertorExecutor convertorExecutor) {
- this.notificationService = notificationService;
- aggregateFlowsInTable =
- AggregateFlowsInTableService.createWithOook(requestContextStack, deviceContext, compatibilityXidSeed);
- allFlowsInAllTables = new AllFlowsInAllTablesService(requestContextStack,
- deviceContext,
- compatibilityXidSeed,
- convertorExecutor);
- allFlowsInTable =
- new AllFlowsInTableService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
- flowsInTable =
- new FlowsInTableService(requestContextStack, deviceContext, compatibilityXidSeed, convertorExecutor);
- }
-
- /**
- * Get statistics for the given match.
- *
- * @deprecated this is the only method with real implementation provided, in delegate it makes no sense.
- */
- @Override
- @Deprecated
- public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>>
- getAggregateFlowStatisticsFromFlowTableForGivenMatch(
- final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
- throw new IllegalAccessError("unsupported by backward compatibility delegate service "
- + "- this rpc is always provided by default service implementation");
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>>
- getAggregateFlowStatisticsFromFlowTableForAllFlows(
- final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
- return aggregateFlowsInTable.handleAndNotify(input, notificationService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
- final GetAllFlowStatisticsFromFlowTableInput input) {
- return allFlowsInTable.handleAndNotify(input, notificationService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>>
- getAllFlowsStatisticsFromAllFlowTables(final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
- return allFlowsInAllTables.handleAndNotify(input, notificationService);
- }
-
- @Override
- public ListenableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
- final GetFlowStatisticsFromFlowTableInput input) {
- return flowsInTable.handleAndNotify(input, notificationService);
- }
-}
* @param input the input
* @return the future
*/
- ListenableFuture<RpcResult<O>> handleAndReply(final I input) {
- final ListenableFuture<RpcResult<List<T>>> rpcReply = handleServiceCall(input);
- ListenableFuture<RpcResult<O>> rpcResult = Futures.transform(rpcReply,
- this::transformResult,
- MoreExecutors.directExecutor());
-
- if (Boolean.TRUE.equals(input.getStoreStats())) {
- rpcResult = Futures.transform(rpcResult, this::storeResult, MoreExecutors.directExecutor());
- }
+ final ListenableFuture<RpcResult<O>> handleAndReply(final I input) {
+ final var rpcResult = Futures.transform(handleServiceCall(input), this::transformResult,
+ MoreExecutors.directExecutor());
- return rpcResult;
+ return Boolean.TRUE.equals(input.getStoreStats())
+ ? Futures.transform(rpcResult, this::storeResult, MoreExecutors.directExecutor()) : rpcResult;
}
private RpcResult<O> transformResult(final RpcResult<List<T>> input) {
*/
package org.opendaylight.openflowplugin.impl.statistics.services.direct;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKey;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.statistics.FlowStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
/**
* The Flow direct statistics service.
*/
-public abstract class AbstractFlowDirectStatisticsService<T extends OfHeader>
- extends AbstractDirectStatisticsService<GetFlowStatisticsInput, GetFlowStatisticsOutput, T> {
-
- protected AbstractFlowDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public abstract class AbstractGetFlowStatistics<T extends OfHeader>
+ extends AbstractDirectStatisticsService<GetFlowStatisticsInput, GetFlowStatisticsOutput, T>
+ implements GetFlowStatistics {
+ protected AbstractGetFlowStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(MultipartType.OFPMPFLOW, requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
+ @Override
+ public final ListenableFuture<RpcResult<GetFlowStatisticsOutput>> invoke(final GetFlowStatisticsInput input) {
+ return handleAndReply(input);
+ }
+
/**
* Get flow ID from #{@link org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry} or
* create alien ID.
* 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.direct;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
/**
* The Group direct statistics service.
*/
-public abstract class AbstractGroupDirectStatisticsService<T extends OfHeader>
- extends AbstractDirectStatisticsService<GetGroupStatisticsInput, GetGroupStatisticsOutput, T> {
+public abstract class AbstractGetGroupStatistics<T extends OfHeader>
+ extends AbstractDirectStatisticsService<GetGroupStatisticsInput, GetGroupStatisticsOutput, T>
+ implements GetGroupStatistics {
+ protected AbstractGetGroupStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
+ super(MultipartType.OFPMPGROUP, requestContextStack, deviceContext, convertorExecutor,
+ statisticsWriterProvider);
+ }
- protected AbstractGroupDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
- super(MultipartType.OFPMPGROUP,
- requestContextStack,
- deviceContext,
- convertorExecutor,
- statisticsWriterProvider);
+ @Override
+ public final ListenableFuture<RpcResult<GetGroupStatisticsOutput>> invoke(final GetGroupStatisticsInput input) {
+ return handleAndReply(input);
}
}
* 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.direct;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
/**
* The Meter direct statistics service.
*/
-public abstract class AbstractMeterDirectStatisticsService<T extends OfHeader> extends
- AbstractDirectStatisticsService<GetMeterStatisticsInput, GetMeterStatisticsOutput, T> {
-
- public AbstractMeterDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public abstract class AbstractGetMeterStatistics<T extends OfHeader>
+ extends AbstractDirectStatisticsService<GetMeterStatisticsInput, GetMeterStatisticsOutput, T>
+ implements GetMeterStatistics {
+ protected AbstractGetMeterStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(MultipartType.OFPMPMETER, requestContextStack, deviceContext, convertorExecutor,
statisticsWriterProvider);
}
+ @Override
+ public final ListenableFuture<RpcResult<GetMeterStatisticsOutput>> invoke(final GetMeterStatisticsInput input) {
+ return handleAndReply(input);
+ }
}
package org.opendaylight.openflowplugin.impl.statistics.services.direct;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
/**
* The Node connector direct statistics service.
*/
-public abstract class AbstractPortDirectStatisticsService<T extends OfHeader>
- extends AbstractDirectStatisticsService<GetNodeConnectorStatisticsInput, GetNodeConnectorStatisticsOutput, T> {
-
- public AbstractPortDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public abstract class AbstractGetNodeConnectorStatistics<T extends OfHeader>
+ extends AbstractDirectStatisticsService<GetNodeConnectorStatisticsInput, GetNodeConnectorStatisticsOutput, T>
+ implements GetNodeConnectorStatistics {
+ protected AbstractGetNodeConnectorStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(MultipartType.OFPMPPORTSTATS,
requestContextStack,
deviceContext,
statisticsWriterProvider);
}
+ @Override
+ public final ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> invoke(
+ final GetNodeConnectorStatisticsInput input) {
+ return handleAndReply(input);
+ }
}
package org.opendaylight.openflowplugin.impl.statistics.services.direct;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.common.RpcResult;
/**
* The Queue direct statistics service.
*/
-public abstract class AbstractQueueDirectStatisticsService<T extends OfHeader>
- extends AbstractDirectStatisticsService<GetQueueStatisticsInput, GetQueueStatisticsOutput, T> {
-
- public AbstractQueueDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public abstract class AbstractGetQueueStatistics<T extends OfHeader>
+ extends AbstractDirectStatisticsService<GetQueueStatisticsInput, GetQueueStatisticsOutput, T>
+ implements GetQueueStatistics {
+ protected AbstractGetQueueStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(MultipartType.OFPMPQUEUE, requestContextStack, deviceContext, convertorExecutor,
- statisticsWriterProvider);
+ statisticsWriterProvider);
+ }
+
+ @Override
+ public final ListenableFuture<RpcResult<GetQueueStatisticsOutput>> invoke(final GetQueueStatisticsInput input) {
+ return handleAndReply(input);
}
}
+++ /dev/null
-/*
- * 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.direct;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-
-/**
- * The Opendaylight direct statistics service.
- * This service handles RPC requests, sends them to registered handlers and returns their replies.
- */
-public class OpendaylightDirectStatisticsServiceImpl implements OpendaylightDirectStatisticsService {
- private final OpendaylightDirectStatisticsServiceProvider provider;
-
- /**
- * Instantiates a new Opendaylight direct statistics service.
- *
- * @param provider the openflow direct statistics service provider
- */
- public OpendaylightDirectStatisticsServiceImpl(final OpendaylightDirectStatisticsServiceProvider provider) {
- this.provider = provider;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(GetGroupStatisticsInput input) {
- return provider.lookup(AbstractGroupDirectStatisticsService.class)
- .map(service -> service.handleAndReply(input))
- .orElse(missingImplementation(AbstractGroupDirectStatisticsService.class));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public ListenableFuture<RpcResult<GetQueueStatisticsOutput>> getQueueStatistics(GetQueueStatisticsInput input) {
- return provider.lookup(AbstractQueueDirectStatisticsService.class)
- .map(service -> service.handleAndReply(input))
- .orElse(missingImplementation(AbstractQueueDirectStatisticsService.class));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public ListenableFuture<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput input) {
- return provider.lookup(AbstractFlowDirectStatisticsService.class)
- .map(service -> service.handleAndReply(input))
- .orElse(missingImplementation(AbstractFlowDirectStatisticsService.class));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(GetMeterStatisticsInput input) {
- return provider.lookup(AbstractMeterDirectStatisticsService.class)
- .map(service -> service.handleAndReply(input))
- .orElse(missingImplementation(AbstractMeterDirectStatisticsService.class));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>>
- getNodeConnectorStatistics(GetNodeConnectorStatisticsInput input) {
- return provider.lookup(AbstractPortDirectStatisticsService.class)
- .map(service -> service.handleAndReply(input))
- .orElse(missingImplementation(AbstractPortDirectStatisticsService.class));
- }
-
- private static <T extends DataObject> ListenableFuture<RpcResult<T>> missingImplementation(Class service) {
- return RpcResultBuilder.<T>failed().withError(
- ErrorType.APPLICATION,
- String.format("No implementation found for direct statistics service %s.", service.getCanonicalName()))
- .buildFuture();
- }
-}
import org.opendaylight.openflowplugin.extension.api.path.MatchPath;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetFlowStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
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;
import org.opendaylight.yangtools.yang.common.Uint32;
-public final class FlowDirectStatisticsService extends AbstractFlowDirectStatisticsService<MultipartReply> {
+public final class MultiGetFlowStatistics extends AbstractGetFlowStatistics<MultipartReply> {
private final FlowStatsResponseConvertorData data;
- public FlowDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+ public MultiGetFlowStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
data = new FlowStatsResponseConvertorData(getVersion());
data.setDatapathId(getDatapathId());
@Override
protected GetFlowStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
- final List<FlowAndStatisticsMapList> statsList = new ArrayList<>();
+ final var statsList = new ArrayList<FlowAndStatisticsMapList>();
if (success) {
- for (final MultipartReply mpReply : input) {
- final MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) mpReply.getMultipartReplyBody();
- final MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
+ for (var mpReply : input) {
+ final var caseBody = (MultipartReplyFlowCase) mpReply.getMultipartReplyBody();
+ final var replyBody = caseBody.getMultipartReplyFlow();
final Optional<List<FlowAndStatisticsMapList>> statsListPart = getConvertorExecutor().convert(
replyBody.getFlowStats(), data);
statsListPart.ifPresent(flowAndStatisticsMapLists -> {
- for (final FlowAndStatisticsMapList part : flowAndStatisticsMapLists) {
- final FlowId flowId = new FlowId(generateFlowId(part).getValue());
+ for (var part : flowAndStatisticsMapLists) {
statsList.add(new FlowAndStatisticsMapListBuilder(part)
- .setFlowId(flowId)
- .build());
+ .setFlowId(new FlowId(generateFlowId(part).getValue()))
+ .build());
}
});
}
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGroupDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetGroupStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
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;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public final class GroupDirectStatisticsService extends AbstractGroupDirectStatisticsService<MultipartReply> {
+public final class MultiGetGroupStatistics extends AbstractGetGroupStatistics<MultipartReply> {
private final VersionConvertorData data;
- public GroupDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+ public MultiGetGroupStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
data = new VersionConvertorData(getVersion());
}
}
final var groupStats = BindingMap.<GroupStatsKey, GroupStats>orderedBuilder();
- for (final MultipartReply mpReply : input) {
- final MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
- final MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
+ for (var mpReply : input) {
+ final var caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
+ final var replyBody = caseBody.getMultipartReplyGroup();
final Optional<List<GroupStats>> groupStatsList = getConvertorExecutor().convert(
replyBody.getGroupStats(), data);
@Override
protected OfHeader buildRequest(final Xid xid, final GetGroupStatisticsInput input) {
- final MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+ final var mprGroupBuild = new MultipartRequestGroupBuilder();
if (input.getGroupId() != null) {
mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue()));
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractMeterDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetMeterStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
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;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class MeterDirectStatisticsService extends AbstractMeterDirectStatisticsService<MultipartReply> {
-
+public final class MultiGetMeterStatistics extends AbstractGetMeterStatistics<MultipartReply> {
private final VersionConvertorData data;
- public MeterDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+ public MultiGetMeterStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
data = new VersionConvertorData(getVersion());
}
final var meterStats = BindingMap.<MeterStatsKey, MeterStats>orderedBuilder();
if (success) {
- for (final MultipartReply mpReply : input) {
- final MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
- final MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
+ for (var mpReply : input) {
+ final var caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
+ final var replyBody = caseBody.getMultipartReplyMeter();
final Optional<List<MeterStats>> meterStatsList =
getConvertorExecutor().convert(replyBody.getMeterStats(), data);
meterStatsList.ifPresent(meterStats::addAll);
@Override
protected OfHeader buildRequest(final Xid xid, final GetMeterStatisticsInput input) {
- final MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
+ final var mprMeterBuild = new MultipartRequestMeterBuilder();
if (input.getMeterId() != null) {
mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue()));
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractPortDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetNodeConnectorStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;
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.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class PortDirectStatisticsService extends AbstractPortDirectStatisticsService<MultipartReply> {
-
- public PortDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class MultiGetNodeConnectorStatistics extends AbstractGetNodeConnectorStatistics<MultipartReply> {
+ public MultiGetNodeConnectorStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
final var nodeConnectorStatisticsAndPortNumberMap = BindingMap.<NodeConnectorStatisticsAndPortNumberMapKey,
NodeConnectorStatisticsAndPortNumberMap>orderedBuilder();
- for (final MultipartReply mpReply : input) {
- final MultipartReplyPortStatsCase caseBody =
- (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
- final MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
+ for (var mpReply : input) {
+ final var caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
+ final var replyBody = caseBody.getMultipartReplyPortStats();
- for (final PortStats portStats : replyBody.nonnullPortStats()) {
- final DurationBuilder durationBuilder = new DurationBuilder();
+ for (var portStats : replyBody.nonnullPortStats()) {
+ final var durationBuilder = new DurationBuilder();
if (portStats.getDurationSec() != null) {
durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
}
@Override
protected OfHeader buildRequest(final Xid xid, final GetNodeConnectorStatisticsInput input) {
- final MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
+ final var mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
if (input.getNodeConnectorId() != null) {
mprPortStatsBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(getOfVersion(),
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractQueueDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetQueueStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
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.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapKey;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class QueueDirectStatisticsService extends AbstractQueueDirectStatisticsService<MultipartReply> {
-
- public QueueDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class MultiGetQueueStatistics extends AbstractGetQueueStatistics<MultipartReply> {
+ public MultiGetQueueStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
final var queueIdAndStatisticsMap =
BindingMap.<QueueIdAndStatisticsMapKey, QueueIdAndStatisticsMap>orderedBuilder();
- for (final MultipartReply mpReply : input) {
- final MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
- final MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
-
- for (final QueueStats queueStats : replyBody.nonnullQueueStats()) {
- final DurationBuilder durationBuilder = new DurationBuilder()
- .setSecond(new Counter32(queueStats.getDurationSec()))
- .setNanosecond(new Counter32(queueStats.getDurationNsec()));
-
- final QueueId queueId = new QueueId(queueStats.getQueueId());
- final NodeConnectorId nodeConnectorId = InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(
- getDatapathId(), queueStats.getPortNo(), getOfVersion());
+ for (var mpReply : input) {
+ final var caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
+ final var replyBody = caseBody.getMultipartReplyQueue();
- final QueueIdAndStatisticsMapBuilder statsBuilder = new QueueIdAndStatisticsMapBuilder()
- .setNodeConnectorId(nodeConnectorId)
- .setQueueId(queueId)
+ for (var queueStats : replyBody.nonnullQueueStats()) {
+ queueIdAndStatisticsMap.add(new QueueIdAndStatisticsMapBuilder()
+ .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(
+ getDatapathId(), queueStats.getPortNo(), getOfVersion()))
+ .setQueueId(new QueueId(queueStats.getQueueId()))
.setTransmissionErrors(new Counter64(queueStats.getTxErrors()))
.setTransmittedBytes(new Counter64(queueStats.getTxBytes()))
.setTransmittedPackets(new Counter64(queueStats.getTxPackets()))
- .setDuration(durationBuilder.build());
-
- queueIdAndStatisticsMap.add(statsBuilder.build());
+ .setDuration(new DurationBuilder()
+ .setSecond(new Counter32(queueStats.getDurationSec()))
+ .setNanosecond(new Counter32(queueStats.getDurationNsec()))
+ .build())
+ .build());
}
}
@Override
protected OfHeader buildRequest(final Xid xid, final GetQueueStatisticsInput input) {
- final MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
-
+ final var mprQueueBuilder = new MultipartRequestQueueBuilder();
if (input.getQueueId() != null) {
mprQueueBuilder.setQueueId(input.getQueueId().getValue());
} else {
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.direct.multilayer;
-
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGroupDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractMeterDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractPortDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractQueueDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceProvider;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-
-/**
- * Utility class for instantiating
- * #{@link org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceProvider}
- * with all multi-layer services already in.
- */
-public final class MultiLayerDirectStatisticsProviderInitializer {
-
- private MultiLayerDirectStatisticsProviderInitializer() {
- }
-
- public static OpendaylightDirectStatisticsServiceProvider createProvider(
- final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
-
- final OpendaylightDirectStatisticsServiceProvider provider = new OpendaylightDirectStatisticsServiceProvider();
-
- provider.register(AbstractFlowDirectStatisticsService.class, new FlowDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractGroupDirectStatisticsService.class, new GroupDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractMeterDirectStatisticsService.class, new MeterDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractPortDirectStatisticsService.class, new PortDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractQueueDirectStatisticsService.class, new QueueDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
-
- return provider;
- }
-}
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetFlowStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
-public class FlowDirectStatisticsService extends AbstractFlowDirectStatisticsService<MultipartReply> {
-
- public FlowDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class SingleGetFlowStatistics extends AbstractGetFlowStatistics<MultipartReply> {
+ public SingleGetFlowStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
@Override
protected GetFlowStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
return new GetFlowStatisticsOutputBuilder()
- .setFlowAndStatisticsMapList(input
- .stream()
+ .setFlowAndStatisticsMapList(input.stream()
.flatMap(multipartReply -> ((MultipartReplyFlowStats) multipartReply.getMultipartReplyBody())
.nonnullFlowAndStatisticsMapList()
.stream())
- .map(flowAndStatisticsMapList -> {
- final FlowId flowId = new FlowId(generateFlowId(flowAndStatisticsMapList));
- return new FlowAndStatisticsMapListBuilder(flowAndStatisticsMapList)
- .setFlowId(flowId)
- .build();
- })
+ .map(flowAndStatisticsMapList -> new FlowAndStatisticsMapListBuilder(flowAndStatisticsMapList)
+ .setFlowId(new FlowId(generateFlowId(flowAndStatisticsMapList)))
+ .build())
.collect(Collectors.toList()))
.build();
}
.build())
.build();
}
-
}
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGroupDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetGroupStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class GroupDirectStatisticsService extends AbstractGroupDirectStatisticsService<MultipartReply> {
-
- public GroupDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class SingleGetGroupStatistics extends AbstractGetGroupStatistics<MultipartReply> {
+ public SingleGetGroupStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
@Override
protected GetGroupStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
- final var map = input.stream()
- .flatMap(multipartReply -> ((MultipartReplyGroupStats) multipartReply.getMultipartReplyBody())
- .nonnullGroupStats().values().stream())
- .collect(BindingMap.toOrderedMap());
-
return new GetGroupStatisticsOutputBuilder()
- .setGroupStats(map)
+ .setGroupStats(input.stream()
+ .flatMap(multipartReply -> ((MultipartReplyGroupStats) multipartReply.getMultipartReplyBody())
+ .nonnullGroupStats().values().stream())
+ .collect(BindingMap.toOrderedMap()))
.build();
}
.build())
.build();
}
-
}
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractMeterDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetMeterStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class MeterDirectStatisticsService extends AbstractMeterDirectStatisticsService<MultipartReply> {
-
- public MeterDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class SingleGetMeterStatistics extends AbstractGetMeterStatistics<MultipartReply> {
+ public SingleGetMeterStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
@Override
protected GetMeterStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
- final var map = input.stream()
- .flatMap(multipartReply -> ((MultipartReplyMeterStats) multipartReply.getMultipartReplyBody())
- .nonnullMeterStats().values().stream())
- .collect(BindingMap.toOrderedMap());
-
return new GetMeterStatisticsOutputBuilder()
- .setMeterStats(map)
+ .setMeterStats(input.stream()
+ .flatMap(multipartReply -> ((MultipartReplyMeterStats) multipartReply.getMultipartReplyBody())
+ .nonnullMeterStats().values().stream())
+ .collect(BindingMap.toOrderedMap()))
.build();
}
.build())
.build();
}
-
}
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractPortDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetNodeConnectorStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class PortDirectStatisticsService extends AbstractPortDirectStatisticsService<MultipartReply> {
-
- public PortDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class SingleGetNodeConnectorStatistics extends AbstractGetNodeConnectorStatistics<MultipartReply> {
+ public SingleGetNodeConnectorStatistics(final RequestContextStack requestContextStack,
+ final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor,
+ final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
@Override
protected GetNodeConnectorStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
- final var map = input.stream()
- .flatMap(multipartReply -> ((MultipartReplyPortStats) multipartReply.getMultipartReplyBody())
- .nonnullNodeConnectorStatisticsAndPortNumberMap().values().stream())
- .collect(BindingMap.toOrderedMap());
-
return new GetNodeConnectorStatisticsOutputBuilder()
- .setNodeConnectorStatisticsAndPortNumberMap(map)
+ .setNodeConnectorStatisticsAndPortNumberMap(input.stream()
+ .flatMap(multipartReply -> ((MultipartReplyPortStats) multipartReply.getMultipartReplyBody())
+ .nonnullNodeConnectorStatisticsAndPortNumberMap().values().stream())
+ .collect(BindingMap.toOrderedMap()))
.build();
}
@Override
- protected OfHeader buildRequest(final Xid xid,
- final GetNodeConnectorStatisticsInput input) {
+ protected OfHeader buildRequest(final Xid xid, final GetNodeConnectorStatisticsInput input) {
return new MultipartRequestBuilder()
.setXid(xid.getValue())
.setVersion(getVersion())
.build())
.build();
}
-
}
import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractQueueDirectStatisticsService;
+import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGetQueueStatistics;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-public class QueueDirectStatisticsService extends AbstractQueueDirectStatisticsService<MultipartReply> {
- public QueueDirectStatisticsService(final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
+public final class SingleGetQueueStatistics extends AbstractGetQueueStatistics<MultipartReply> {
+ public SingleGetQueueStatistics(final RequestContextStack requestContextStack, final DeviceContext deviceContext,
+ final ConvertorExecutor convertorExecutor, final MultipartWriterProvider statisticsWriterProvider) {
super(requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider);
}
@Override
protected GetQueueStatisticsOutput buildReply(final List<MultipartReply> input, final boolean success) {
- final var map = input.stream()
- .flatMap(multipartReply -> ((MultipartReplyQueueStats) multipartReply.getMultipartReplyBody())
- .nonnullQueueIdAndStatisticsMap().values()
- .stream())
- .collect(BindingMap.toOrderedMap());
-
return new GetQueueStatisticsOutputBuilder()
- .setQueueIdAndStatisticsMap(map)
+ .setQueueIdAndStatisticsMap(input.stream()
+ .flatMap(multipartReply -> ((MultipartReplyQueueStats) multipartReply.getMultipartReplyBody())
+ .nonnullQueueIdAndStatisticsMap().values()
+ .stream())
+ .collect(BindingMap.toOrderedMap()))
.build();
}
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.direct.singlelayer;
-
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.impl.datastore.MultipartWriterProvider;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractGroupDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractMeterDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractPortDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractQueueDirectStatisticsService;
-import org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceProvider;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-
-/**
- * Utility class for instantiating
- * #{@link org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceProvider}
- * with all multi-layer services already in.
- */
-public final class SingleLayerDirectStatisticsProviderInitializer {
-
- private SingleLayerDirectStatisticsProviderInitializer() {
- }
-
- public static OpendaylightDirectStatisticsServiceProvider createProvider(
- final RequestContextStack requestContextStack,
- final DeviceContext deviceContext,
- final ConvertorExecutor convertorExecutor,
- final MultipartWriterProvider statisticsWriterProvider) {
-
- final OpendaylightDirectStatisticsServiceProvider provider = new OpendaylightDirectStatisticsServiceProvider();
-
- provider.register(AbstractFlowDirectStatisticsService.class, new FlowDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractGroupDirectStatisticsService.class, new GroupDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractMeterDirectStatisticsService.class, new MeterDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractPortDirectStatisticsService.class, new PortDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
- provider.register(AbstractQueueDirectStatisticsService.class, new QueueDirectStatisticsService(
- requestContextStack, deviceContext, convertorExecutor, statisticsWriterProvider));
-
- return provider;
- }
-
-}
*/
package org.opendaylight.openflowplugin.impl.util;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
* @param <T> type of input future
* @param input future to chain barrier to
* @param nodeRef target device
- * @param transactionService barrier service
+ * @param sendBarrier barrier service
* @param compositeTransform composite transform
* @return future holding both results (input and of the barrier)
*/
- public static <T> ListenableFuture<RpcResult<T>> chainBarrier(
- final ListenableFuture<RpcResult<T>> input, final NodeRef nodeRef,
- final FlowCapableTransactionService transactionService,
+ public static <T> ListenableFuture<RpcResult<T>> chainBarrier(final ListenableFuture<RpcResult<T>> input,
+ final NodeRef nodeRef, final SendBarrier sendBarrier,
final Function<Pair<RpcResult<T>, RpcResult<SendBarrierOutput>>, RpcResult<T>> compositeTransform) {
- final MutablePair<RpcResult<T>, RpcResult<SendBarrierOutput>> resultPair = new MutablePair<>();
+ final var resultPair = new MutablePair<RpcResult<T>, RpcResult<SendBarrierOutput>>();
// store input result and append barrier
- final ListenableFuture<RpcResult<SendBarrierOutput>> barrierResult = Futures.transformAsync(input,
- interInput -> {
- resultPair.setLeft(interInput);
- final SendBarrierInput barrierInput = createSendBarrierInput(nodeRef);
- return transactionService.sendBarrier(barrierInput);
- }, MoreExecutors.directExecutor());
+ final var barrierResult = Futures.transformAsync(input, interInput -> {
+ resultPair.setLeft(interInput);
+ return sendBarrier.invoke(createSendBarrierInput(nodeRef));
+ }, MoreExecutors.directExecutor());
// store barrier result and return initiated pair
- final ListenableFuture<Pair<RpcResult<T>, RpcResult<SendBarrierOutput>>> compositeResult = Futures.transform(
- barrierResult,
- input1 -> {
- resultPair.setRight(input1);
- return resultPair;
- }, MoreExecutors.directExecutor());
+ final var compositeResult = Futures.transform(barrierResult, input1 -> {
+ resultPair.setRight(input1);
+ return resultPair;
+ }, MoreExecutors.directExecutor());
// append assembling transform to barrier result
return Futures.transform(compositeResult, compositeTransform, MoreExecutors.directExecutor());
}
* @param nodeRef rpc routing context
* @return input for {@link FlowCapableTransactionService#sendBarrier(SendBarrierInput)}
*/
- public static SendBarrierInput createSendBarrierInput(final NodeRef nodeRef) {
- return new SendBarrierInputBuilder()
- .setNode(nodeRef)
- .build();
+ @VisibleForTesting
+ static SendBarrierInput createSendBarrierInput(final NodeRef nodeRef) {
+ return new SendBarrierInputBuilder().setNode(nodeRef).build();
}
}
*/
package org.opendaylight.openflowplugin.impl.rpc;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.google.common.collect.ClassToInstanceMap;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.yangtools.concepts.ObjectRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.Rpc;
import org.opendaylight.yangtools.yang.binding.RpcService;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint8;
private ExtensionConverterProvider extensionConverterProvider;
@Mock
private ConvertorExecutor convertorExecutor;
+ @Captor
+ private ArgumentCaptor<ClassToInstanceMap<Rpc<?, ?>>> captor;
private KeyedInstanceIdentifier<Node, NodeKey> nodeInstanceIdentifier;
private RpcContextImpl rpcContext;
@Test
public void testInstantiateServiceInstance() {
- when(rpcProviderRegistry.registerRpcImplementation(any(), any(RpcService.class),
+ when(rpcProviderRegistry.registerRpcImplementations(any(),
eq(Set.of(nodeInstanceIdentifier)))).thenReturn(registration);
rpcContext.instantiateServiceInstance();
- verify(rpcProviderRegistry, times(21)).registerRpcImplementation(any(), any(RpcService.class),
- eq(Set.of(nodeInstanceIdentifier)));
+ verify(rpcProviderRegistry).registerRpcImplementations(captor.capture(), eq(Set.of(nodeInstanceIdentifier)));
+
+ final var map = captor.getValue();
+ assertEquals(46, map.size());
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.common.Uint32;
-public class EchoServiceTest extends ServiceMocking {
-
+public class SendEchoImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID_VALUE = Uint32.valueOf(100);
private static final byte[] DUMMY_DATA = "DUMMY DATA".getBytes();
- EchoService echoService;
+
+ private SendEchoImpl sendEcho;
@Override
public void setup() {
- echoService = new EchoService(mockedRequestContextStack, mockedDeviceContext);
+ sendEcho = new SendEchoImpl(mockedRequestContextStack, mockedDeviceContext);
}
@Test
public void testSendEcho() {
EchoInputBuilder sendEchoInput = new EchoInputBuilder();
- echoService.handleServiceCall(sendEchoInput);
+ sendEcho.handleServiceCall(sendEchoInput);
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testBuildRequest() {
EchoInputBuilder sendEchoInput = new EchoInputBuilder().setData(DUMMY_DATA);
- final OfHeader request = this.echoService.buildRequest(new Xid(DUMMY_XID_VALUE), sendEchoInput);
+ final OfHeader request = sendEcho.buildRequest(new Xid(DUMMY_XID_VALUE), sendEchoInput);
assertEquals(DUMMY_XID_VALUE, request.getXid());
assertTrue(request instanceof EchoInput);
final byte[] data = ((EchoInput) request).getData();
*/
package org.opendaylight.openflowplugin.impl.services.sal;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.Future;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowplugin.impl.services.batch.BatchPlanStep;
import org.opendaylight.openflowplugin.impl.services.batch.BatchStepJob;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailure;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailureBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.SalFlowsBatchService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.output.list.grouping.BatchFailedFlowsOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.SalGroupsBatchService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.OriginalBatchedGroupBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.UpdatedBatchedGroupBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.SalMetersBatchService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.OriginalBatchedMeterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.UpdatedBatchedMeterBuilder;
* Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalFlatBatchServiceImpl}.
*/
@RunWith(MockitoJUnitRunner.class)
-public class SalFlatBatchServiceImplTest {
-
+public class ProcessFlatBatchImplTest {
private static final NodeId NODE_ID = new NodeId("ut-node-id");
private static final InstanceIdentifier<Node> NODE_II = InstanceIdentifier.create(Nodes.class)
.child(Node.class, new NodeKey(NODE_ID));
private static final NodeRef NODE_REF = new NodeRef(NODE_II);
@Mock
- private SalFlowsBatchService salFlowsBatchService;
+ private AddFlowsBatch addFlowsBatch;
+ @Mock
+ private RemoveFlowsBatch removeFlowsBatch;
+ @Mock
+ private UpdateFlowsBatch updateFlowsBatch;
+ @Mock
+ private AddGroupsBatch addGroupsBatch;
+ @Mock
+ private RemoveGroupsBatch removeGroupsBatch;
+ @Mock
+ private UpdateGroupsBatch updateGroupsBatch;
@Mock
- private SalGroupsBatchService salGroupsBatchService;
+ private AddMetersBatch addMetersBatch;
@Mock
- private SalMetersBatchService salMetersBatchService;
+ private RemoveMetersBatch removeMetersBatch;
+ @Mock
+ private UpdateMetersBatch updateMetersBatch;
@Captor
private ArgumentCaptor<AddFlowsBatchInput> addFlowsBatchInputCpt;
- private SalFlatBatchServiceImpl salFlatBatchService;
+ private ProcessFlatBatchImpl processFlatBatch;
@Before
public void setUp() {
- salFlatBatchService =
- new SalFlatBatchServiceImpl(salFlowsBatchService, salGroupsBatchService, salMetersBatchService);
-
+ processFlatBatch = new ProcessFlatBatchImpl(addFlowsBatch, removeFlowsBatch, updateFlowsBatch, addGroupsBatch,
+ removeGroupsBatch, updateGroupsBatch, addMetersBatch, removeMetersBatch, updateMetersBatch);
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(salFlowsBatchService, salGroupsBatchService, salMetersBatchService);
+ verifyNoMoreInteractions(addFlowsBatch, removeFlowsBatch, updateFlowsBatch, addGroupsBatch,
+ removeGroupsBatch, updateGroupsBatch, addMetersBatch, removeMetersBatch, updateMetersBatch);
}
@Test
public void testProcessFlatBatch_allSuccessFinished() throws Exception {
- Mockito.when(salFlowsBatchService.addFlowsBatch(ArgumentMatchers.any()))
+ when(addFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddFlowsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salFlowsBatchService.removeFlowsBatch(ArgumentMatchers.any()))
+ when(removeFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveFlowsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salFlowsBatchService.updateFlowsBatch(ArgumentMatchers.any()))
+ when(updateFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateFlowsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.addGroupsBatch(ArgumentMatchers.any()))
+ when(addGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.removeGroupsBatch(ArgumentMatchers.any()))
+ when(removeGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.updateGroupsBatch(ArgumentMatchers.any()))
+ when(updateGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.addMetersBatch(ArgumentMatchers.any()))
+ when(addMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddMetersBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.removeMetersBatch(ArgumentMatchers.any()))
+ when(removeMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveMetersBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.updateMetersBatch(ArgumentMatchers.any()))
+ when(updateMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateMetersBatchOutputBuilder().build()).buildFuture());
.setExitOnFirstError(true)
.build();
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.processFlatBatch(batchInput);
- Assert.assertTrue(rpcResultFuture.isDone());
- final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertTrue(rpcResult.getErrors().isEmpty());
- Assert.assertTrue(rpcResult.getResult().nonnullBatchFailure().isEmpty());
-
- final InOrder inOrder = Mockito.inOrder(salFlowsBatchService, salGroupsBatchService, salMetersBatchService);
- inOrder.verify(salFlowsBatchService).addFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).removeFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).updateFlowsBatch(ArgumentMatchers.any());
-
- inOrder.verify(salGroupsBatchService).addGroupsBatch(ArgumentMatchers.any());
- inOrder.verify(salGroupsBatchService).removeGroupsBatch(ArgumentMatchers.any());
- inOrder.verify(salGroupsBatchService).updateGroupsBatch(ArgumentMatchers.any());
-
- inOrder.verify(salMetersBatchService).addMetersBatch(ArgumentMatchers.any());
- inOrder.verify(salMetersBatchService).removeMetersBatch(ArgumentMatchers.any());
- inOrder.verify(salMetersBatchService).updateMetersBatch(ArgumentMatchers.any());
+ final var rpcResultFuture = processFlatBatch.invoke(batchInput);
+ assertTrue(rpcResultFuture.isDone());
+ final var rpcResult = rpcResultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertTrue(rpcResult.getErrors().isEmpty());
+ assertTrue(rpcResult.getResult().nonnullBatchFailure().isEmpty());
+
+ final var inOrder = inOrder(addFlowsBatch, removeFlowsBatch, updateFlowsBatch, addGroupsBatch,
+ removeGroupsBatch, updateGroupsBatch, addMetersBatch, removeMetersBatch, updateMetersBatch);
+ inOrder.verify(addFlowsBatch).invoke(any());
+ inOrder.verify(removeFlowsBatch).invoke(any());
+ inOrder.verify(updateFlowsBatch).invoke(any());
+
+ inOrder.verify(addGroupsBatch).invoke(any());
+ inOrder.verify(removeGroupsBatch).invoke(any());
+ inOrder.verify(updateGroupsBatch).invoke(any());
+
+ inOrder.verify(addMetersBatch).invoke(any());
+ inOrder.verify(removeMetersBatch).invoke(any());
+ inOrder.verify(updateMetersBatch).invoke(any());
}
@Test
.setExitOnFirstError(true)
.build();
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.processFlatBatch(batchInput);
- Assert.assertTrue(rpcResultFuture.isDone());
- final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertFalse(rpcResult.isSuccessful());
- Assert.assertEquals(1, rpcResult.getErrors().size());
- Assert.assertEquals(1, rpcResult.getResult().nonnullBatchFailure().size());
- Assert.assertEquals(3, rpcResult.getResult().nonnullBatchFailure().values().iterator().next()
+ final var rpcResultFuture = processFlatBatch.invoke(batchInput);
+ assertTrue(rpcResultFuture.isDone());
+ final var rpcResult = rpcResultFuture.get();
+ assertFalse(rpcResult.isSuccessful());
+ assertEquals(1, rpcResult.getErrors().size());
+ assertEquals(1, rpcResult.getResult().nonnullBatchFailure().size());
+ assertEquals(3, rpcResult.getResult().nonnullBatchFailure().values().iterator().next()
.getBatchOrder().intValue());
- final InOrder inOrder = Mockito.inOrder(salFlowsBatchService, salGroupsBatchService, salMetersBatchService);
- inOrder.verify(salFlowsBatchService).addFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).removeFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).updateFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salGroupsBatchService).addGroupsBatch(ArgumentMatchers.any());
+ final var inOrder = inOrder(addFlowsBatch, removeFlowsBatch, updateFlowsBatch, addGroupsBatch);
+ inOrder.verify(addFlowsBatch).invoke(any());
+ inOrder.verify(removeFlowsBatch).invoke(any());
+ inOrder.verify(updateFlowsBatch).invoke(any());
+ inOrder.verify(addGroupsBatch).invoke(any());
}
@Test
.setExitOnFirstError(false)
.build();
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.processFlatBatch(batchInput);
- Assert.assertTrue(rpcResultFuture.isDone());
+ final var rpcResultFuture = processFlatBatch.invoke(batchInput);
+ assertTrue(rpcResultFuture.isDone());
final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertFalse(rpcResult.isSuccessful());
- Assert.assertEquals(1, rpcResult.getErrors().size());
- Assert.assertEquals(1, rpcResult.getResult().nonnullBatchFailure().size());
- Assert.assertEquals(3, rpcResult.getResult().nonnullBatchFailure().values().iterator().next()
+ assertFalse(rpcResult.isSuccessful());
+ assertEquals(1, rpcResult.getErrors().size());
+ assertEquals(1, rpcResult.getResult().nonnullBatchFailure().size());
+ assertEquals(3, rpcResult.getResult().nonnullBatchFailure().values().iterator().next()
.getBatchOrder().intValue());
- final InOrder inOrder = Mockito.inOrder(salFlowsBatchService, salGroupsBatchService, salMetersBatchService);
- inOrder.verify(salFlowsBatchService).addFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).removeFlowsBatch(ArgumentMatchers.any());
- inOrder.verify(salFlowsBatchService).updateFlowsBatch(ArgumentMatchers.any());
+ final var inOrder = inOrder(addFlowsBatch, removeFlowsBatch, updateFlowsBatch, addGroupsBatch,
+ removeGroupsBatch, updateGroupsBatch, addMetersBatch, removeMetersBatch, updateMetersBatch);
+ inOrder.verify(addFlowsBatch).invoke(any());
+ inOrder.verify(removeFlowsBatch).invoke(any());
+ inOrder.verify(updateFlowsBatch).invoke(any());
- inOrder.verify(salGroupsBatchService).addGroupsBatch(ArgumentMatchers.any());
- inOrder.verify(salGroupsBatchService).removeGroupsBatch(ArgumentMatchers.any());
- inOrder.verify(salGroupsBatchService).updateGroupsBatch(ArgumentMatchers.any());
+ inOrder.verify(addGroupsBatch).invoke(any());
+ inOrder.verify(removeGroupsBatch).invoke(any());
+ inOrder.verify(updateGroupsBatch).invoke(any());
- inOrder.verify(salMetersBatchService).addMetersBatch(ArgumentMatchers.any());
- inOrder.verify(salMetersBatchService).removeMetersBatch(ArgumentMatchers.any());
- inOrder.verify(salMetersBatchService).updateMetersBatch(ArgumentMatchers.any());
+ inOrder.verify(addMetersBatch).invoke(any());
+ inOrder.verify(removeMetersBatch).invoke(any());
+ inOrder.verify(updateMetersBatch).invoke(any());
}
private void prepareFirstFailingMockService() {
- Mockito.when(salFlowsBatchService.addFlowsBatch(ArgumentMatchers.any()))
+ when(addFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddFlowsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salFlowsBatchService.removeFlowsBatch(ArgumentMatchers.any()))
+ when(removeFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.<RemoveFlowsBatchOutput>failed()
.withResult(new RemoveFlowsBatchOutputBuilder()
.setBatchFailedFlowsOutput(BindingMap.ordered(
.build())
.withError(ErrorType.APPLICATION, "ut-firstFlowAddError")
.buildFuture());
- Mockito.when(salFlowsBatchService.updateFlowsBatch(ArgumentMatchers.any()))
+ when(updateFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateFlowsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.addGroupsBatch(ArgumentMatchers.any()))
+ when(addGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.removeGroupsBatch(ArgumentMatchers.any()))
+ when(removeGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salGroupsBatchService.updateGroupsBatch(ArgumentMatchers.any()))
+ when(updateGroupsBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateGroupsBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.addMetersBatch(ArgumentMatchers.any()))
+ when(addMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddMetersBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.removeMetersBatch(ArgumentMatchers.any()))
+ when(removeMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveMetersBatchOutputBuilder().build()).buildFuture());
- Mockito.when(salMetersBatchService.updateMetersBatch(ArgumentMatchers.any()))
+ when(updateMetersBatch.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateMetersBatchOutputBuilder().build()).buildFuture());
}
@Test
public void testExecuteBatchPlan() throws Exception {
- BatchStepJob batchStepJob1 = Mockito.mock(BatchStepJob.class);
- BatchStepJob batchStepJob2 = Mockito.mock(BatchStepJob.class);
+ BatchStepJob batchStepJob1 = mock(BatchStepJob.class);
+ BatchStepJob batchStepJob2 = mock(BatchStepJob.class);
AsyncFunction<RpcResult<ProcessFlatBatchOutput>, RpcResult<ProcessFlatBatchOutput>> function1 =
- Mockito.mock(AsyncFunction.class);
+ mock(AsyncFunction.class);
AsyncFunction<RpcResult<ProcessFlatBatchOutput>, RpcResult<ProcessFlatBatchOutput>> function2 =
- Mockito.mock(AsyncFunction.class);
- Mockito.when(batchStepJob1.getStepFunction()).thenReturn(function1);
- Mockito.when(batchStepJob2.getStepFunction()).thenReturn(function2);
+ mock(AsyncFunction.class);
+ when(batchStepJob1.getStepFunction()).thenReturn(function1);
+ when(batchStepJob2.getStepFunction()).thenReturn(function2);
BatchPlanStep batchPlanStep1 = new BatchPlanStep(BatchStepType.GROUP_ADD);
batchPlanStep1.setBarrierAfter(true);
BatchPlanStep batchPlanStep2 = new BatchPlanStep(BatchStepType.FLOW_ADD);
batchPlanStep1.setBarrierAfter(false);
- Mockito.when(batchStepJob1.getPlanStep()).thenReturn(batchPlanStep1);
- Mockito.when(batchStepJob2.getPlanStep()).thenReturn(batchPlanStep2);
+ when(batchStepJob1.getPlanStep()).thenReturn(batchPlanStep1);
+ when(batchStepJob2.getPlanStep()).thenReturn(batchPlanStep2);
final ListenableFuture<RpcResult<ProcessFlatBatchOutput>> succeededChainOutput =
FlatBatchUtil.createEmptyRpcBatchResultFuture(true);
createFlowBatchFailure(Uint16.ONE, "f2")))
.buildFuture();
- Mockito.when(batchStepJob1.getStepFunction().apply(ArgumentMatchers.any()))
- .thenReturn(succeededChainOutput);
- Mockito.when(batchStepJob2.getStepFunction().apply(ArgumentMatchers.any()))
- .thenReturn(failedChainOutput);
+ when(batchStepJob1.getStepFunction().apply(any())).thenReturn(succeededChainOutput);
+ when(batchStepJob2.getStepFunction().apply(any())).thenReturn(failedChainOutput);
final List<BatchStepJob> batchChainElements = Lists.newArrayList(batchStepJob1, batchStepJob2);
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.executeBatchPlan(batchChainElements);
+ final var rpcResultFuture = processFlatBatch.executeBatchPlan(batchChainElements);
- Assert.assertTrue(rpcResultFuture.isDone());
- final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertFalse(rpcResult.isSuccessful());
- Assert.assertEquals(1, rpcResult.getErrors().size());
- Assert.assertEquals(2, rpcResult.getResult().nonnullBatchFailure().size());
+ assertTrue(rpcResultFuture.isDone());
+ final var rpcResult = rpcResultFuture.get();
+ assertFalse(rpcResult.isSuccessful());
+ assertEquals(1, rpcResult.getErrors().size());
+ assertEquals(2, rpcResult.getResult().nonnullBatchFailure().size());
Iterator<BatchFailure> iterator = rpcResult.getResult().nonnullBatchFailure().values().iterator();
//Moving iterator two get second element
iterator.next();
- Assert.assertEquals("f2",
+ assertEquals("f2",
((FlatBatchFailureFlowIdCase) iterator.next().getBatchItemIdChoice())
.getFlowId().getValue());
}
batchPlanStep.getTaskBag().addAll(Lists.newArrayList(flatBatchAddFlow_1, flatBatchAddFlow_2));
final List<BatchPlanStep> batchPlan = Lists.newArrayList(batchPlanStep);
- final List<BatchStepJob> batchChain = salFlatBatchService.prepareBatchChain(batchPlan, NODE_REF, true);
+ final List<BatchStepJob> batchChain = processFlatBatch.prepareBatchChain(batchPlan, NODE_REF, true);
- Assert.assertEquals(1, batchChain.size());
+ assertEquals(1, batchChain.size());
- Mockito.when(salFlowsBatchService.addFlowsBatch(ArgumentMatchers.any()))
+ when(addFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder
.success(new AddFlowsBatchOutputBuilder().build())
.buildFuture());
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.executeBatchPlan(batchChain);
- Assert.assertTrue(rpcResultFuture.isDone());
- final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(0, rpcResult.getErrors().size());
- Assert.assertEquals(0, rpcResult.getResult().nonnullBatchFailure().size());
+ final var rpcResultFuture = processFlatBatch.executeBatchPlan(batchChain);
+ assertTrue(rpcResultFuture.isDone());
+ final var rpcResult = rpcResultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(0, rpcResult.getErrors().size());
+ assertEquals(0, rpcResult.getResult().nonnullBatchFailure().size());
- Mockito.verify(salFlowsBatchService).addFlowsBatch(ArgumentMatchers.any());
+ verify(addFlowsBatch).invoke(any());
}
@Test
final List<BatchPlanStep> batchPlan = Lists.newArrayList(batchPlanStep, batchPlanStep);
- final List<BatchStepJob> batchChain = salFlatBatchService.prepareBatchChain(batchPlan, NODE_REF, true);
+ final List<BatchStepJob> batchChain = processFlatBatch.prepareBatchChain(batchPlan, NODE_REF, true);
- Assert.assertEquals(2, batchChain.size());
+ assertEquals(2, batchChain.size());
- Mockito.when(salFlowsBatchService.addFlowsBatch(ArgumentMatchers.any()))
+ when(addFlowsBatch.invoke(any()))
.thenReturn(RpcResultBuilder
.<AddFlowsBatchOutput>failed()
.withResult(new AddFlowsBatchOutputBuilder()
.withError(ErrorType.APPLICATION, "ut-addFlowBatchError")
.buildFuture());
- final Future<RpcResult<ProcessFlatBatchOutput>> rpcResultFuture =
- salFlatBatchService.executeBatchPlan(batchChain);
- Assert.assertTrue(rpcResultFuture.isDone());
- final RpcResult<ProcessFlatBatchOutput> rpcResult = rpcResultFuture.get();
- Assert.assertFalse(rpcResult.isSuccessful());
- Assert.assertEquals(2, rpcResult.getErrors().size());
- Assert.assertEquals(4, rpcResult.getResult().getBatchFailure().size());
+ final var rpcResultFuture = processFlatBatch.executeBatchPlan(batchChain);
+ assertTrue(rpcResultFuture.isDone());
+ final var rpcResult = rpcResultFuture.get();
+ assertFalse(rpcResult.isSuccessful());
+ assertEquals(2, rpcResult.getErrors().size());
+ assertEquals(4, rpcResult.getResult().getBatchFailure().size());
- Mockito.verify(salFlowsBatchService, Mockito.times(2)).addFlowsBatch(addFlowsBatchInputCpt.capture());
- Assert.assertEquals(2, addFlowsBatchInputCpt.getValue().getBatchAddFlows().size());
+ verify(addFlowsBatch, times(2)).invoke(addFlowsBatchInputCpt.capture());
+ assertEquals(2, addFlowsBatchInputCpt.getValue().nonnullBatchAddFlows().size());
}
}
*/
package org.opendaylight.openflowplugin.impl.services.sal;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.Future;
-import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.GetAsyncImpl;
+import org.opendaylight.openflowplugin.impl.services.singlelayer.SetAsyncImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.GetAsyncOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.async.config.service.rev170619.SetAsyncOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
/**
*/
@RunWith(MockitoJUnitRunner.class)
public class SalAsyncConfigServiceImplTest extends ServiceMocking {
-
- private SalAsyncConfigServiceImpl salAsyncConfigService;
-
- @Override
- public void setup() {
- salAsyncConfigService = new SalAsyncConfigServiceImpl(
- mockedRequestContextStack, mockedDeviceContext);
- }
-
@Test
public void testSetAsync() throws Exception {
- final SetAsyncInput setAsyncInput = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
+ final var setAsync = new SetAsyncImpl(mockedRequestContextStack, mockedDeviceContext);
+
+ final var setAsyncInput = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
.rev130731.SetAsyncInputBuilder().build();
- final RpcResult<SetAsyncInput> replyRpcResult = RpcResultBuilder.success(setAsyncInput).build();
- final ListenableFuture<RpcResult<SetAsyncInput>> replyFuture = Futures.immediateFuture(replyRpcResult);
- Mockito.when(mockedRequestContext.getFuture()).thenReturn(replyFuture);
+ final var replyRpcResult = RpcResultBuilder.success(setAsyncInput).build();
+ final var replyFuture = Futures.immediateFuture(replyRpcResult);
+ when(mockedRequestContext.getFuture()).thenReturn(replyFuture);
- final ListenableFuture<RpcResult<SetAsyncOutput>> setAsyncResult =
- salAsyncConfigService.setAsync(new SetAsyncInputBuilder().build());
+ final var setAsyncResult = setAsync.invoke(new SetAsyncInputBuilder().build());
- Assert.assertNotNull(setAsyncResult);
- Assert.assertTrue(setAsyncResult.isDone());
- Assert.assertTrue(setAsyncResult.get().isSuccessful());
+ assertNotNull(setAsyncResult);
+ assertTrue(setAsyncResult.isDone());
+ assertTrue(setAsyncResult.get().isSuccessful());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testGetAsyncTest() throws Exception {
- final GetAsyncOutput getAsyncOutput = new GetAsyncOutputBuilder().build();
- final RpcResult<GetAsyncOutput> replyRpcResult = RpcResultBuilder.success(getAsyncOutput).build();
- final ListenableFuture<RpcResult<GetAsyncOutput>> replyFuture = Futures.immediateFuture(replyRpcResult);
- Mockito.when(mockedRequestContext.getFuture()).thenReturn(replyFuture);
+ final var getAsync = new GetAsyncImpl(mockedRequestContextStack, mockedDeviceContext);
+
+ final var getAsyncOutput = new GetAsyncOutputBuilder().build();
+ final var replyRpcResult = RpcResultBuilder.success(getAsyncOutput).build();
+ final var replyFuture = Futures.immediateFuture(replyRpcResult);
+ when(mockedRequestContext.getFuture()).thenReturn(replyFuture);
- final Future<RpcResult<GetAsyncOutput>> getAsyncResult =
- salAsyncConfigService.getAsync(new GetAsyncInputBuilder().build());
+ final var getAsyncResult = getAsync.invoke(new GetAsyncInputBuilder().build());
- Assert.assertNotNull(getAsyncResult);
- Assert.assertTrue(getAsyncResult.isDone());
- Assert.assertTrue(getAsyncResult.get().isSuccessful());
+ assertNotNull(getAsyncResult);
+ assertTrue(getAsyncResult.isDone());
+ assertTrue(getAsyncResult.get().isSuccessful());
verify(mockedRequestContextStack).createRequestContext();
verify(mockedOutboundQueue).commitEntry(eq(ServiceMocking.DUMMY_XID_VALUE), any(), any());
}
package org.opendaylight.openflowplugin.impl.services.sal;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.SettableFuture;
-import java.util.ArrayList;
import java.util.List;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.Messages;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.MessagesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.MessageBuilder;
@RunWith(MockitoJUnitRunner.class)
public class SalBundleServiceImplTest {
-
private static final NodeRef NODE_REF = new NodeRef(InstanceIdentifier.create(Nodes.class)
.child(Node.class, new NodeKey(new NodeId("openflow:1"))));
private static final BundleId BUNDLE_ID = new BundleId(Uint32.ONE);
private static final BundleFlags BUNDLE_FLAGS = new BundleFlags(true, false);
- private SalBundleService service;
@Mock
- private SalExperimenterMessageService experimenterMessageService;
+ private SendExperimenter sendExperimenter;
@Mock
private List<BundleProperty> properties;
- @Before
- public void setUp() {
- service = new SalBundleServiceImpl(experimenterMessageService);
- }
-
@Test
public void testControlBundle() {
- final ControlBundleInput input = new ControlBundleInputBuilder()
+ final var service = new ControlBundleImpl(sendExperimenter);
+
+ final var input = new ControlBundleInputBuilder()
.setNode(NODE_REF)
.setBundleId(BUNDLE_ID)
.setFlags(BUNDLE_FLAGS)
.setType(BundleControlType.ONFBCTOPENREQUEST)
.setBundleProperty(properties)
.build();
- final SendExperimenterInputBuilder experimenterBuilder = new SendExperimenterInputBuilder();
- experimenterBuilder.setNode(NODE_REF);
- experimenterBuilder.setExperimenterMessageOfChoice(new BundleControlSalBuilder()
+ when(sendExperimenter.invoke(any())).thenReturn(SettableFuture.create());
+ service.invoke(input);
+ verify(sendExperimenter).invoke(new SendExperimenterInputBuilder()
+ .setNode(NODE_REF)
+ .setExperimenterMessageOfChoice(new BundleControlSalBuilder()
.setSalControlData(new SalControlDataBuilder(input).build())
- .build());
- Mockito.when(experimenterMessageService.sendExperimenter(any())).thenReturn(SettableFuture.create());
- service.controlBundle(input);
- Mockito.verify(experimenterMessageService).sendExperimenter(experimenterBuilder.build());
+ .build())
+ .build());
}
@Test
public void testAddBundleMessages() {
- final List<Message> innerMessages = createMessages();
- final Messages messages = new MessagesBuilder().setMessage(innerMessages).build();
- final AddBundleMessagesInput input = new AddBundleMessagesInputBuilder()
+ final var service = new AddBundleMessagesImpl(sendExperimenter);
+
+ final var innerMessages = createMessages();
+ final var messages = new MessagesBuilder().setMessage(innerMessages).build();
+ final var input = new AddBundleMessagesInputBuilder()
.setNode(NODE_REF)
.setBundleId(BUNDLE_ID)
.setFlags(BUNDLE_FLAGS)
.setBundleProperty(properties)
.setMessages(messages)
.build();
- final SalAddMessageDataBuilder dataBuilder = new SalAddMessageDataBuilder();
+ final var dataBuilder = new SalAddMessageDataBuilder();
dataBuilder.setBundleId(BUNDLE_ID).setFlags(BUNDLE_FLAGS).setBundleProperty(properties);
- final BundleAddMessageSalBuilder addMessageBuilder = new BundleAddMessageSalBuilder();
- final SendExperimenterInputBuilder experimenterBuilder = new SendExperimenterInputBuilder()
+ final var addMessageBuilder = new BundleAddMessageSalBuilder();
+ final var experimenterBuilder = new SendExperimenterInputBuilder()
.setNode(NODE_REF);
- Mockito.when(experimenterMessageService.sendExperimenter(any())).thenReturn(SettableFuture.create());
- service.addBundleMessages(input);
- for (Message msg : innerMessages) {
- Mockito.verify(experimenterMessageService)
- .sendExperimenter(experimenterBuilder
- .setExperimenterMessageOfChoice(addMessageBuilder
- .setSalAddMessageData(
- dataBuilder.setNode(NODE_REF).setBundleInnerMessage(
- msg.getBundleInnerMessage())
- .build())
- .build()).build());
+ when(sendExperimenter.invoke(any())).thenReturn(SettableFuture.create());
+ service.invoke(input);
+ for (var msg : innerMessages) {
+ verify(sendExperimenter).invoke(experimenterBuilder
+ .setExperimenterMessageOfChoice(addMessageBuilder
+ .setSalAddMessageData(
+ dataBuilder.setNode(NODE_REF).setBundleInnerMessage(
+ msg.getBundleInnerMessage())
+ .build())
+ .build())
+ .build());
}
}
private static List<Message> createMessages() {
- List<Message> messages = new ArrayList<>();
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleAddFlowCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleUpdateFlowCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleRemoveFlowCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleAddGroupCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleUpdateGroupCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleRemoveGroupCaseBuilder().build())
- .build());
- messages.add(
- new MessageBuilder().setNode(NODE_REF).setBundleInnerMessage(new BundleUpdatePortCaseBuilder().build())
- .build());
- return messages;
+ final var builder = new MessageBuilder().setNode(NODE_REF);
+ return List.of(
+ builder.setBundleInnerMessage(new BundleAddFlowCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleUpdateFlowCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleRemoveFlowCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleAddGroupCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleUpdateGroupCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleRemoveGroupCaseBuilder().build()).build(),
+ builder.setBundleInnerMessage(new BundleUpdatePortCaseBuilder().build()).build());
}
-
}
*/
package org.opendaylight.openflowplugin.impl.services.sal;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.Future;
-import org.junit.Assert;
import org.junit.Test;
-import org.mockito.Mockito;
+import org.opendaylight.openflowplugin.impl.services.SendEchoImpl;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEchoInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEchoInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEchoOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutputBuilder;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
public class SalEchoServiceImplTest extends ServiceMocking {
-
private static final byte[] DUMMY_DATA = "DUMMY DATA".getBytes();
- SalEchoServiceImpl salEchoService;
+
+ private SendEchoImpl salEchoService;
@Override
protected void setup() {
- salEchoService = new SalEchoServiceImpl(mockedRequestContextStack, mockedDeviceContext);
+ salEchoService = new SendEchoImpl(mockedRequestContextStack, mockedDeviceContext);
}
@Test
public void testSendEcho() throws Exception {
- final EchoOutput echoOut = new EchoOutputBuilder()
- .setData(DUMMY_DATA)
- .build();
- final RpcResult<EchoOutput> replyRpcResult = RpcResultBuilder.success(echoOut).build();
- final ListenableFuture<RpcResult<EchoOutput>> replyFt = Futures.immediateFuture(replyRpcResult);
- Mockito.when(mockedRequestContext.getFuture()).thenReturn(replyFt);
- SendEchoInput sendEchoInput = new SendEchoInputBuilder()
- .setData(DUMMY_DATA)
- .build();
-
- final Future<RpcResult<SendEchoOutput>> echoOutput = salEchoService.sendEcho(sendEchoInput);
-
- Assert.assertNotNull(echoOutput);
- Assert.assertTrue(echoOutput.isDone());
- Assert.assertTrue(echoOutput.get().isSuccessful());
+ final var echoOut = new EchoOutputBuilder().setData(DUMMY_DATA).build();
+ final var replyRpcResult = RpcResultBuilder.success(echoOut).build();
+ final var replyFt = Futures.immediateFuture(replyRpcResult);
+ when(mockedRequestContext.getFuture()).thenReturn(replyFt);
+ final var sendEchoInput = new SendEchoInputBuilder().setData(DUMMY_DATA).build();
+
+ final var echoOutput = salEchoService.invoke(sendEchoInput);
+
+ assertNotNull(echoOutput);
+ assertTrue(echoOutput.isDone());
+ assertTrue(echoOutput.get().isSuccessful());
verify(mockedRequestContextStack).createRequestContext();
verify(mockedOutboundQueue).commitEntry(eq(Uint32.valueOf(2121)), any(), any());
}
*/
package org.opendaylight.openflowplugin.impl.services.sal;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
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.FlowKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
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.OriginalFlowBuilder;
import org.opendaylight.yangtools.yang.common.Uint8;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
-public class SalFlowServiceImplTest extends TestCase {
-
+public class SalFlowServiceImplTest {
private static final Uint64 DUMMY_DATAPATH_ID = Uint64.valueOf(444);
private static final String DUMMY_NODE_ID = "dummyNodeID";
private static final String DUMMY_FLOW_ID = "dummyFlowID";
private static final Uint8 DUMMY_TABLE_ID = Uint8.ZERO;
- private static final KeyedInstanceIdentifier<Node, NodeKey> NODE_II
- = InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(new NodeId(DUMMY_NODE_ID)));
+ private static final KeyedInstanceIdentifier<Node, NodeKey> NODE_II =
+ InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(new NodeId(DUMMY_NODE_ID)));
- private static final KeyedInstanceIdentifier<Table, TableKey> TABLE_II
- = NODE_II.augmentation(FlowCapableNode.class).child(Table.class, new TableKey(DUMMY_TABLE_ID));
+ private static final KeyedInstanceIdentifier<Table, TableKey> TABLE_II =
+ NODE_II.augmentation(FlowCapableNode.class).child(Table.class, new TableKey(DUMMY_TABLE_ID));
private final NodeRef noderef = new NodeRef(NODE_II);
when(mockedDeviceContext.getDeviceInfo()).thenReturn(mockedDeviceInfo);
}
- private SalFlowServiceImpl mockSalFlowService(final Uint8 version) {
+ private AddFlowImpl mockAddFlow(final Uint8 version) {
+ when(mockedFeatures.getVersion()).thenReturn(version);
+ when(mockedFeaturesOutput.getVersion()).thenReturn(version);
+ when(mockedDeviceInfo.getVersion()).thenReturn(version);
+
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ return new AddFlowImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ }
+
+ private RemoveFlowImpl mockRemoveFlow(final Uint8 version) {
+ when(mockedFeatures.getVersion()).thenReturn(version);
+ when(mockedFeaturesOutput.getVersion()).thenReturn(version);
+ when(mockedDeviceInfo.getVersion()).thenReturn(version);
+
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ return new RemoveFlowImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ }
+
+ private UpdateFlowImpl mockUpdateFlow(final Uint8 version) {
when(mockedFeatures.getVersion()).thenReturn(version);
when(mockedFeaturesOutput.getVersion()).thenReturn(version);
when(mockedDeviceInfo.getVersion()).thenReturn(version);
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- return new SalFlowServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ return new UpdateFlowImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
}
@Test
.setNode(noderef)
.build();
- Mockito.doReturn(Futures.<RequestContext<Object>>immediateFailedFuture(new Exception("ut-failed-response")))
+ doReturn(Futures.<RequestContext<Object>>immediateFailedFuture(new Exception("ut-failed-response")))
.when(requestContext).getFuture();
- final Future<RpcResult<AddFlowOutput>> rpcResultFuture =
- mockSalFlowService(version).addFlow(mockedAddFlowInput);
+ final var rpcResultFuture = mockAddFlow(version).invoke(mockedAddFlowInput);
assertNotNull(rpcResultFuture);
- final RpcResult<?> addFlowOutputRpcResult = rpcResultFuture.get();
+ final var addFlowOutputRpcResult = rpcResultFuture.get();
assertNotNull(addFlowOutputRpcResult);
assertFalse(addFlowOutputRpcResult.isSuccessful());
}
.setNode(noderef)
.build();
- Mockito.doReturn(Futures.<RequestContext<Object>>immediateFailedFuture(new Exception("ut-failed-response")))
+ doReturn(Futures.<RequestContext<Object>>immediateFailedFuture(new Exception("ut-failed-response")))
.when(requestContext).getFuture();
- final Future<RpcResult<RemoveFlowOutput>> rpcResultFuture =
- mockSalFlowService(version).removeFlow(mockedRemoveFlowInput);
+ final var rpcResultFuture = mockRemoveFlow(version).invoke(mockedRemoveFlowInput);
assertNotNull(rpcResultFuture);
- final RpcResult<?> removeFlowOutputRpcResult = rpcResultFuture.get();
+ final var removeFlowOutputRpcResult = rpcResultFuture.get();
assertNotNull(removeFlowOutputRpcResult);
assertFalse(removeFlowOutputRpcResult.isSuccessful());
}
.setTableId(Uint8.ONE)
.setNode(noderef)
.build();
- SalFlowServiceImpl salFlowService = mockSalFlowService(version);
+ var addFlow = mockAddFlow(version);
- verifyOutput(salFlowService.addFlow(mockedAddFlowInput));
+ verifyOutput(addFlow.invoke(mockedAddFlowInput));
}
@Test
.setNode(noderef)
.build();
- SalFlowServiceImpl salFlowService = mockSalFlowService(version);
- verifyOutput(salFlowService.removeFlow(mockedRemoveFlowInput));
+ final var removeFlow = mockRemoveFlow(version);
+ verifyOutput(removeFlow.invoke(mockedRemoveFlowInput));
}
@Test
when(mockedUpdateFlowInput1.getUpdatedFlow()).thenReturn(mockedUpdateFlow1);
FlowRef mockedFlowRef = mock(FlowRef.class);
- Mockito.doReturn(TABLE_II.child(Flow.class,
+ doReturn(TABLE_II.child(Flow.class,
new FlowKey(new FlowId(DUMMY_FLOW_ID)))).when(mockedFlowRef).getValue();
when(mockedUpdateFlowInput.getFlowRef()).thenReturn(mockedFlowRef);
when(mockedUpdateFlowInput1.getFlowRef()).thenReturn(mockedFlowRef);
when(mockedUpdateFlowInput.getOriginalFlow()).thenReturn(mockedOriginalFlow);
when(mockedUpdateFlowInput1.getOriginalFlow()).thenReturn(mockedOriginalFlow1);
- SalFlowServiceImpl salFlowService = mockSalFlowService(version);
- verifyOutput(salFlowService.updateFlow(mockedUpdateFlowInput));
- verifyOutput(salFlowService.updateFlow(mockedUpdateFlowInput1));
+ final var updateFlow = mockUpdateFlow(version);
+ verifyOutput(updateFlow.invoke(mockedUpdateFlowInput));
+ verifyOutput(updateFlow.invoke(mockedUpdateFlowInput1));
}
- private static <T extends DataObject> void verifyOutput(final Future<RpcResult<T>> rpcResultFuture)
+ private static <T extends DataObject> void verifyOutput(final ListenableFuture<RpcResult<T>> rpcResultFuture)
throws ExecutionException, InterruptedException {
assertNotNull(rpcResultFuture);
- final RpcResult<?> addFlowOutputRpcResult = rpcResultFuture.get();
+ final var addFlowOutputRpcResult = rpcResultFuture.get();
assertNotNull(addFlowOutputRpcResult);
assertTrue(addFlowOutputRpcResult.isSuccessful());
}
* 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.sal;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.Future;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlow;
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.flow.service.rev130819.RemoveFlowOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.RemoveFlowsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.UpdateFlowsBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.add.flows.batch.input.BatchAddFlows;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.add.flows.batch.input.BatchAddFlowsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.input.update.grouping.OriginalBatchedFlowBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.input.update.grouping.UpdatedBatchedFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.output.list.grouping.BatchFailedFlowsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.remove.flows.batch.input.BatchRemoveFlows;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.remove.flows.batch.input.BatchRemoveFlowsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.update.flows.batch.input.BatchUpdateFlows;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint8;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalFlowsBatchServiceImpl}.
*/
@RunWith(MockitoJUnitRunner.class)
public class SalFlowsBatchServiceImplTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(SalFlowsBatchServiceImplTest.class);
-
public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
- public static final NodeRef NODE_REF =
- new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
+ public static final NodeRef NODE_REF = new NodeRef(
+ InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
+ public static final String FLOW_ID_VALUE_1 = "ut-dummy-flow1";
+ public static final String FLOW_ID_VALUE_2 = "ut-dummy-flow2";
@Mock
- private SalFlowService salFlowService;
+ private AddFlow addFlow;
@Mock
- private FlowCapableTransactionService transactionService;
+ private RemoveFlow removeFlow;
+ @Mock
+ private UpdateFlow updateFlow;
+ @Mock
+ private SendBarrier sendBarrier;
@Captor
private ArgumentCaptor<RemoveFlowInput> removeFlowInputCpt;
@Captor
@Captor
private ArgumentCaptor<AddFlowInput> addFlowInputCpt;
- private SalFlowsBatchServiceImpl salFlowsBatchService;
- public static final String FLOW_ID_VALUE_1 = "ut-dummy-flow1";
- public static final String FLOW_ID_VALUE_2 = "ut-dummy-flow2";
+ private AddFlowsBatchImpl addFlowsBatch;
+ private RemoveFlowsBatchImpl removeFlowsBatch;
+ private UpdateFlowsBatchImpl updateFlowsBatch;
@Before
public void setUp() {
- salFlowsBatchService = new SalFlowsBatchServiceImpl(salFlowService, transactionService);
+ addFlowsBatch = new AddFlowsBatchImpl(addFlow, sendBarrier);
+ removeFlowsBatch = new RemoveFlowsBatchImpl(removeFlow, sendBarrier);
+ updateFlowsBatch = new UpdateFlowsBatchImpl(updateFlow, sendBarrier);
- Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
- .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
+ when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(salFlowService, transactionService);
+ verifyNoMoreInteractions(addFlow, removeFlow, updateFlow, sendBarrier);
}
@Test
public void testRemoveFlowsBatch_success() throws Exception {
- Mockito.when(salFlowService.removeFlow(ArgumentMatchers.any()))
+ when(removeFlow.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveFlowOutputBuilder().build())
.buildFuture());
- final String flow1IdValue = "ut-dummy-flow1";
- final String flow2IdValue = "ut-dummy-flow2";
- final BatchRemoveFlows batchFlow1 = createEmptyBatchRemoveFlow(flow1IdValue, 42);
- final BatchRemoveFlows batchFlow2 = createEmptyBatchRemoveFlow(flow2IdValue, 43);
+ final var flow1IdValue = "ut-dummy-flow1";
+ final var flow2IdValue = "ut-dummy-flow2";
+ final var batchFlow1 = createEmptyBatchRemoveFlow(flow1IdValue, 42);
+ final var batchFlow2 = createEmptyBatchRemoveFlow(flow2IdValue, 43);
- final RemoveFlowsBatchInput input = new RemoveFlowsBatchInputBuilder()
+ final var input = new RemoveFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveFlows(BindingMap.ordered(batchFlow1, batchFlow2))
.build();
- final Future<RpcResult<RemoveFlowsBatchOutput>> resultFuture = salFlowsBatchService.removeFlowsBatch(input);
+ final var resultFuture = removeFlowsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<RemoveFlowsBatchOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- final RemoveFlowsBatchOutput result = rpcResult.getResult();
- Assert.assertEquals(0, result.nonnullBatchFailedFlowsOutput().size());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ final var result = rpcResult.getResult();
+ assertEquals(0, result.nonnullBatchFailedFlowsOutput().size());
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
+ final var inOrder = inOrder(removeFlow, sendBarrier);
- inOrder.verify(salFlowService, Mockito.times(2)).removeFlow(removeFlowInputCpt.capture());
- final List<RemoveFlowInput> allValues = removeFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getPriority().longValue());
- Assert.assertEquals(43, allValues.get(1).getPriority().longValue());
+ inOrder.verify(removeFlow, times(2)).invoke(removeFlowInputCpt.capture());
+ final var allValues = removeFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getPriority().longValue());
+ assertEquals(43, allValues.get(1).getPriority().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testRemoveFlowsBatch_failed() throws Exception {
- Mockito.when(salFlowService.removeFlow(ArgumentMatchers.any()))
+ when(removeFlow.invoke(any()))
.thenReturn(RpcResultBuilder.<RemoveFlowOutput>failed()
.withError(ErrorType.APPLICATION, "flow-remove-fail-1")
.buildFuture());
- final BatchRemoveFlows batchFlow1 = createEmptyBatchRemoveFlow(FLOW_ID_VALUE_1, 42);
- final BatchRemoveFlows batchFlow2 = createEmptyBatchRemoveFlow(FLOW_ID_VALUE_2, 43);
+ final var batchFlow1 = createEmptyBatchRemoveFlow(FLOW_ID_VALUE_1, 42);
+ final var batchFlow2 = createEmptyBatchRemoveFlow(FLOW_ID_VALUE_2, 43);
- final RemoveFlowsBatchInput input = new RemoveFlowsBatchInputBuilder()
+ final var input = new RemoveFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveFlows(BindingMap.ordered(batchFlow1, batchFlow2))
.build();
- final Future<RpcResult<RemoveFlowsBatchOutput>> resultFuture = salFlowsBatchService.removeFlowsBatch(input);
+ final var resultFuture = removeFlowsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<RemoveFlowsBatchOutput> rpcResult = resultFuture.get();
- Assert.assertFalse(rpcResult.isSuccessful());
- final RemoveFlowsBatchOutput result = rpcResult.getResult();
- Iterator<BatchFailedFlowsOutput> iterator = result.nonnullBatchFailedFlowsOutput().values().iterator();
- Assert.assertEquals(2, result.nonnullBatchFailedFlowsOutput().size());
- Assert.assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
- Assert.assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertFalse(rpcResult.isSuccessful());
+ final var result = rpcResult.getResult();
+ var iterator = result.nonnullBatchFailedFlowsOutput().values().iterator();
+ assertEquals(2, result.nonnullBatchFailedFlowsOutput().size());
+ assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
+ assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
+ final var inOrder = inOrder(removeFlow, sendBarrier);
- inOrder.verify(salFlowService, Mockito.times(2)).removeFlow(removeFlowInputCpt.capture());
- final List<RemoveFlowInput> allValues = removeFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getPriority().longValue());
- Assert.assertEquals(43, allValues.get(1).getPriority().longValue());
+ inOrder.verify(removeFlow, times(2)).invoke(removeFlowInputCpt.capture());
+ final var allValues = removeFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getPriority().longValue());
+ assertEquals(43, allValues.get(1).getPriority().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
private static BatchAddFlows createEmptyBatchAddFlow(final String flowIdValue, final int priority) {
}
private static BatchUpdateFlows createEmptyBatchUpdateFlow(final String flowIdValue, final int priority) {
- final BatchAddFlows emptyOriginalFlow = createEmptyBatchAddFlow(flowIdValue, priority);
- final BatchAddFlows emptyUpdatedFlow = createEmptyBatchAddFlow(flowIdValue, priority + 1);
+ final var emptyOriginalFlow = createEmptyBatchAddFlow(flowIdValue, priority);
+ final var emptyUpdatedFlow = createEmptyBatchAddFlow(flowIdValue, priority + 1);
return new BatchUpdateFlowsBuilder()
.setFlowId(new FlowId(flowIdValue))
.setOriginalBatchedFlow(new OriginalBatchedFlowBuilder(emptyOriginalFlow).build())
@Test
public void testAddFlowsBatch_success() throws Exception {
- Mockito.when(salFlowService.addFlow(ArgumentMatchers.any()))
+ when(addFlow.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddFlowOutputBuilder().build()).buildFuture());
- final AddFlowsBatchInput input = new AddFlowsBatchInputBuilder()
+ final var input = new AddFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddFlows(BindingMap.ordered(
createEmptyBatchAddFlow("ut-dummy-flow2", 43)))
.build();
- final Future<RpcResult<AddFlowsBatchOutput>> resultFuture = salFlowsBatchService.addFlowsBatch(input);
+ final var resultFuture = addFlowsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
+ final var inOrder = inOrder(addFlow, sendBarrier);
- inOrder.verify(salFlowService, Mockito.times(2)).addFlow(addFlowInputCpt.capture());
- final List<AddFlowInput> allValues = addFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getPriority().longValue());
- Assert.assertEquals(43, allValues.get(1).getPriority().longValue());
+ inOrder.verify(addFlow, times(2)).invoke(addFlowInputCpt.capture());
+ final var allValues = addFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getPriority().longValue());
+ assertEquals(43, allValues.get(1).getPriority().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testAddFlowsBatch_failed() throws Exception {
- Mockito.when(salFlowService.addFlow(ArgumentMatchers.any()))
+ when(addFlow.invoke(any()))
.thenReturn(RpcResultBuilder
.<AddFlowOutput>failed().withError(ErrorType.APPLICATION, "ut-groupAddError")
.buildFuture());
- final AddFlowsBatchInput input = new AddFlowsBatchInputBuilder()
+ final var input = new AddFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddFlows(BindingMap.ordered(
createEmptyBatchAddFlow(FLOW_ID_VALUE_2, 43)))
.build();
- final Future<RpcResult<AddFlowsBatchOutput>> resultFuture = salFlowsBatchService.addFlowsBatch(input);
- Iterator<BatchFailedFlowsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedFlowsOutput()
- .values().iterator();
+ final var resultFuture = addFlowsBatch.invoke(input);
+
+ assertTrue(resultFuture.isDone());
+
+ final var result = resultFuture.get();
+ assertFalse(result.isSuccessful());
+ assertEquals(2, result.getResult().nonnullBatchFailedFlowsOutput().size());
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedFlowsOutput().size());
- Assert.assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
- Assert.assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ final var iterator = result.getResult().nonnullBatchFailedFlowsOutput().values().iterator();
+ assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
+ assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
+ final var inOrder = inOrder(addFlow, sendBarrier);
- inOrder.verify(salFlowService, Mockito.times(2)).addFlow(addFlowInputCpt.capture());
- final List<AddFlowInput> allValues = addFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getPriority().longValue());
- Assert.assertEquals(43, allValues.get(1).getPriority().longValue());
+ inOrder.verify(addFlow, times(2)).invoke(addFlowInputCpt.capture());
+ final var allValues = addFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getPriority().longValue());
+ assertEquals(43, allValues.get(1).getPriority().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testUpdateFlowsBatch_success() throws Exception {
- Mockito.when(salFlowService.updateFlow(ArgumentMatchers.any()))
+ when(updateFlow.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateFlowOutputBuilder().build()).buildFuture());
- final UpdateFlowsBatchInput input = new UpdateFlowsBatchInputBuilder()
+ final var input = new UpdateFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchUpdateFlows(BindingMap.ordered(
createEmptyBatchUpdateFlow(FLOW_ID_VALUE_2, 44)))
.build();
- final Future<RpcResult<UpdateFlowsBatchOutput>> resultFuture = salFlowsBatchService.updateFlowsBatch(input);
+ final var resultFuture = updateFlowsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
+ final var inOrder = inOrder(updateFlow, sendBarrier);
- inOrder.verify(salFlowService, Mockito.times(2)).updateFlow(updateFlowInputCpt.capture());
- final List<UpdateFlowInput> allValues = updateFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalFlow().getPriority().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedFlow().getPriority().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalFlow().getPriority().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedFlow().getPriority().longValue());
+ inOrder.verify(updateFlow, times(2)).invoke(updateFlowInputCpt.capture());
+ final var allValues = updateFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalFlow().getPriority().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedFlow().getPriority().longValue());
+ assertEquals(44, allValues.get(1).getOriginalFlow().getPriority().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedFlow().getPriority().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testUpdateFlowsBatch_failure() throws Exception {
- Mockito.when(salFlowService.updateFlow(ArgumentMatchers.any()))
+ when(updateFlow.invoke(any()))
.thenReturn(RpcResultBuilder.<UpdateFlowOutput>failed()
.withError(ErrorType.APPLICATION, "ut-flowUpdateError")
.buildFuture());
- final UpdateFlowsBatchInput input = new UpdateFlowsBatchInputBuilder()
+ final var input = new UpdateFlowsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchUpdateFlows(BindingMap.ordered(
createEmptyBatchUpdateFlow(FLOW_ID_VALUE_2, 44)))
.build();
- final Future<RpcResult<UpdateFlowsBatchOutput>> resultFuture = salFlowsBatchService.updateFlowsBatch(input);
- Iterator<BatchFailedFlowsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedFlowsOutput()
- .values().iterator();
-
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedFlowsOutput().size());
- Assert.assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
- Assert.assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
-
- final InOrder inOrder = Mockito.inOrder(salFlowService, transactionService);
- inOrder.verify(salFlowService, Mockito.times(2)).updateFlow(updateFlowInputCpt.capture());
- final List<UpdateFlowInput> allValues = updateFlowInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalFlow().getPriority().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedFlow().getPriority().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalFlow().getPriority().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedFlow().getPriority().longValue());
-
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ final var resultFuture = updateFlowsBatch.invoke(input);
+ assertTrue(resultFuture.isDone());
+ final var result = resultFuture.get();
+ assertFalse(result.isSuccessful());
+ assertEquals(2, result.getResult().nonnullBatchFailedFlowsOutput().size());
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedFlowsOutput().values().iterator();
+ assertEquals(FLOW_ID_VALUE_1, iterator.next().getFlowId().getValue());
+ assertEquals(FLOW_ID_VALUE_2, iterator.next().getFlowId().getValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
+
+ final var inOrder = inOrder(updateFlow, sendBarrier);
+ inOrder.verify(updateFlow, times(2)).invoke(updateFlowInputCpt.capture());
+ final var allValues = updateFlowInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalFlow().getPriority().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedFlow().getPriority().longValue());
+ assertEquals(44, allValues.get(1).getOriginalFlow().getPriority().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedFlow().getPriority().longValue());
+
+ inOrder.verify(sendBarrier).invoke(any());
}
}
import org.mockito.Mock;
import org.opendaylight.openflowplugin.api.openflow.registry.group.DeviceGroupRegistry;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yangtools.yang.common.Uint32;
public class SalGroupServiceImplTest extends ServiceMocking {
-
private static final Uint32 DUMMY_GROUP_ID = Uint32.valueOf(15);
- private static final
- KeyedInstanceIdentifier<Node, NodeKey> NODE_II = InstanceIdentifier.create(Nodes.class).child(Node.class,
- new NodeKey(new NodeId(DUMMY_NODE_ID)));
- NodeRef noderef = new NodeRef(NODE_II);
+ private static final KeyedInstanceIdentifier<Node, NodeKey> NODE_II =
+ InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(new NodeId(DUMMY_NODE_ID)));
+
+ private final NodeRef noderef = new NodeRef(NODE_II);
@Mock
- DeviceGroupRegistry mockedDeviceGroupRegistry;
+ private DeviceGroupRegistry mockedDeviceGroupRegistry;
- SalGroupServiceImpl salGroupService;
+ private AddGroupImpl addGroup;
+ private RemoveGroupImpl removeGroup;
+ private UpdateGroupImpl updateGroup;
@Override
protected void setup() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- salGroupService = new SalGroupServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ addGroup = new AddGroupImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ removeGroup = new RemoveGroupImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ updateGroup = new UpdateGroupImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
}
@Test
}
private void addGroup() {
- final GroupId dummyGroupId = new GroupId(DUMMY_GROUP_ID);
- AddGroupInput addGroupInput = new AddGroupInputBuilder().setGroupId(dummyGroupId).setNode(noderef).build();
+ final var dummyGroupId = new GroupId(DUMMY_GROUP_ID);
+ final var addGroupInput = new AddGroupInputBuilder().setGroupId(dummyGroupId).setNode(noderef).build();
this.<AddGroupOutput>mockSuccessfulFuture();
- salGroupService.addGroup(addGroupInput);
+ addGroup.invoke(addGroupInput);
verify(mockedRequestContextStack).createRequestContext();
}
}
private void updateGroup() {
- final UpdatedGroup updatedGroup = new UpdatedGroupBuilder().setGroupId(new GroupId(DUMMY_GROUP_ID)).build();
- final OriginalGroup originalGroup = new OriginalGroupBuilder().setGroupId(new GroupId(DUMMY_GROUP_ID)).build();
- final UpdateGroupInput updateGroupInput =
+ final var updatedGroup = new UpdatedGroupBuilder().setGroupId(new GroupId(DUMMY_GROUP_ID)).build();
+ final var originalGroup = new OriginalGroupBuilder().setGroupId(new GroupId(DUMMY_GROUP_ID)).build();
+ final var updateGroupInput =
new UpdateGroupInputBuilder().setUpdatedGroup(updatedGroup).setOriginalGroup(originalGroup).build();
this.<UpdateGroupOutput>mockSuccessfulFuture();
- salGroupService.updateGroup(updateGroupInput);
+ updateGroup.invoke(updateGroupInput);
verify(mockedRequestContextStack).createRequestContext();
}
}
private void removeGroup() {
- final GroupId dummyGroupId = new GroupId(DUMMY_GROUP_ID);
- RemoveGroupInput removeGroupInput = new RemoveGroupInputBuilder().setGroupId(dummyGroupId).build();
+ final var dummyGroupId = new GroupId(DUMMY_GROUP_ID);
+ final var removeGroupInput = new RemoveGroupInputBuilder().setGroupId(dummyGroupId).build();
this.<RemoveGroupOutput>mockSuccessfulFuture();
- salGroupService.removeGroup(removeGroupInput);
+ removeGroup.invoke(removeGroupInput);
verify(mockedRequestContextStack).createRequestContext();
}
* 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.sal;
-import com.google.common.collect.Lists;
-import java.util.Iterator;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
import java.util.List;
-import java.util.concurrent.Future;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroup;
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.AddGroupOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroup;
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.service.rev130918.UpdateGroupOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroups;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroupsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.OriginalBatchedGroupBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.UpdatedBatchedGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.output.list.grouping.BatchFailedGroupsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroups;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroupsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
*/
@RunWith(MockitoJUnitRunner.class)
public class SalGroupsBatchServiceImplTest {
-
public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
public static final NodeRef NODE_REF =
new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
@Mock
- private SalGroupService salGroupService;
+ private AddGroup addGroup;
+ @Mock
+ private RemoveGroup removeGroup;
@Mock
- private FlowCapableTransactionService transactionService;
+ private UpdateGroup updateGroup;
+ @Mock
+ private SendBarrier sendBarrier;
@Captor
private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
@Captor
@Captor
private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
- private SalGroupsBatchServiceImpl salGroupsBatchService;
-
+ private AddGroupsBatchImpl addGroupsBatch;
+ private RemoveGroupsBatchImpl removeGroupsBatch;
+ private UpdateGroupsBatchImpl updateGroupsBatch;
@Before
public void setUp() {
- salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
+ addGroupsBatch = new AddGroupsBatchImpl(addGroup, sendBarrier);
+ removeGroupsBatch = new RemoveGroupsBatchImpl(removeGroup, sendBarrier);
+ updateGroupsBatch = new UpdateGroupsBatchImpl(updateGroup, sendBarrier);
- Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
- .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
+ when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
+ verifyNoMoreInteractions(addGroup, removeGroup, updateGroup, sendBarrier);
}
@Test
public void testUpdateGroupsBatch_success() throws Exception {
- Mockito.when(salGroupService.updateGroup(Mockito.any()))
+ when(updateGroup.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
- final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
+ final var input = new UpdateGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
- .setBatchUpdateGroups(Lists.newArrayList(
+ .setBatchUpdateGroups(List.of(
createEmptyBatchUpdateGroup(42L),
createEmptyBatchUpdateGroup(44L)))
.build();
- final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
+ final var resultFuture = updateGroupsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
- inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
- final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
+ final var inOrder = inOrder(updateGroup, sendBarrier);
+ inOrder.verify(updateGroup, times(2)).invoke(updateGroupInputCpt.capture());
+ final var allValues = updateGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
+ assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testUpdateGroupsBatch_failure() throws Exception {
- Mockito.when(salGroupService.updateGroup(Mockito.any()))
+ when(updateGroup.invoke(any()))
.thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
.withError(ErrorType.APPLICATION, "ur-groupUpdateError")
.buildFuture());
- final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
+ final var input = new UpdateGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
- .setBatchUpdateGroups(Lists.newArrayList(
+ .setBatchUpdateGroups(List.of(
createEmptyBatchUpdateGroup(42L),
createEmptyBatchUpdateGroup(44L)))
.build();
- final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
- Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
+ final var resultFuture = updateGroupsBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
.values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
- Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(45L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
+ assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(45L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
- inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
- final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
+ final var inOrder = inOrder(updateGroup, sendBarrier);
+ inOrder.verify(updateGroup, times(2)).invoke(updateGroupInputCpt.capture());
+ final var allValues = updateGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
+ assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testAddGroupsBatch_success() throws Exception {
- Mockito.when(salGroupService.addGroup(Mockito.any()))
+ when(addGroup.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
- final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
+ final var input = new AddGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddGroups(BindingMap.ordered(
createEmptyBatchAddGroup(43L)))
.build();
- final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
+ final var resultFuture = addGroupsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
- inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
- final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
+ final var inOrder = inOrder(addGroup, sendBarrier);
+ inOrder.verify(addGroup, times(2)).invoke(addGroupInputCpt.capture());
+ final var allValues = addGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testAddGroupsBatch_failure() throws Exception {
- Mockito.when(salGroupService.addGroup(Mockito.any()))
+ when(addGroup.invoke(any()))
.thenReturn(RpcResultBuilder.<AddGroupOutput>failed()
.withError(ErrorType.APPLICATION, "ut-groupAddError")
.buildFuture());
- final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
+ final var input = new AddGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddGroups(BindingMap.ordered(
createEmptyBatchAddGroup(43L)))
.build();
- final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
- Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
- .values().iterator();
+ final var resultFuture = addGroupsBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
- Assert.assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
+ assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
- inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
- final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
+ final var inOrder = inOrder(addGroup, sendBarrier);
+ inOrder.verify(addGroup, times(2)).invoke(addGroupInputCpt.capture());
+ final var allValues = addGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testRemoveGroupsBatch_success() throws Exception {
- Mockito.when(salGroupService.removeGroup(Mockito.any()))
+ when(removeGroup.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
- final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
+ final var input = new RemoveGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveGroups(BindingMap.ordered(
createEmptyBatchRemoveGroup(43L)))
.build();
- final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
+ final var resultFuture = removeGroupsBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
+ final var inOrder = inOrder(removeGroup, sendBarrier);
- inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
- final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
+ inOrder.verify(removeGroup, times(2)).invoke(removeGroupInputCpt.capture());
+ final var allValues = removeGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testRemoveGroupsBatch_failure() throws Exception {
- Mockito.when(salGroupService.removeGroup(Mockito.any()))
+ when(removeGroup.invoke(any()))
.thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed()
.withError(ErrorType.APPLICATION, "ut-groupRemoveError")
.buildFuture());
- final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
+ final var input = new RemoveGroupsBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveGroups(BindingMap.ordered(
createEmptyBatchRemoveGroup(43L)))
.build();
- final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
- Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
- .values().iterator();
+ final var resultFuture = removeGroupsBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
- Assert.assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
+ assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
+ final var inOrder = inOrder(removeGroup, sendBarrier);
- inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
- final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
+ inOrder.verify(removeGroup, times(2)).invoke(removeGroupInputCpt.capture());
+ final var allValues = removeGroupInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
import org.mockito.Mock;
import org.opendaylight.openflowplugin.api.openflow.registry.meter.DeviceMeterRegistry;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
import org.opendaylight.yangtools.yang.common.Uint32;
public class SalMeterServiceImplTest extends ServiceMocking {
-
private static final Uint32 DUMMY_METER_ID = Uint32.valueOf(15);
private static final Uint32 DUMMY_METTER_ID = Uint32.valueOf(2000);
@Mock
- DeviceMeterRegistry mockedDeviceMeterRegistry;
+ private DeviceMeterRegistry mockedDeviceMeterRegistry;
- SalMeterServiceImpl salMeterService;
+ private AddMeterImpl addMeter;
+ private RemoveMeterImpl removeMeter;
+ private UpdateMeterImpl updateMeter;
@Override
protected void setup() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- salMeterService = new SalMeterServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ addMeter = new AddMeterImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ removeMeter = new RemoveMeterImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ updateMeter = new UpdateMeterImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
}
@Test
public void testAddMeter() {
- addMeter();
- }
-
-
- private void addMeter() {
- final MeterId dummyMeterId = new MeterId(DUMMY_METER_ID);
- AddMeterInput addMeterInput = new AddMeterInputBuilder().setMeterId(dummyMeterId).build();
this.<AddMeterOutput>mockSuccessfulFuture();
- salMeterService.addMeter(addMeterInput);
+ addMeter.invoke(new AddMeterInputBuilder().setMeterId(new MeterId(DUMMY_METER_ID)).build());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testUpdateMeter() {
- updateMeter();
- }
-
-
- private void updateMeter() {
- final UpdatedMeter dummyUpdatedMeter =
- new UpdatedMeterBuilder().setMeterId(new MeterId(DUMMY_METTER_ID)).build();
- final OriginalMeter dummyOriginalMeter =
- new OriginalMeterBuilder().setMeterId(new MeterId(DUMMY_METTER_ID)).build();
-
- final UpdateMeterInput updateMeterInput = new UpdateMeterInputBuilder()
- .setUpdatedMeter(dummyUpdatedMeter).setOriginalMeter(dummyOriginalMeter).build();
-
this.<AddMeterOutput>mockSuccessfulFuture();
- salMeterService.updateMeter(updateMeterInput);
+ updateMeter.invoke(new UpdateMeterInputBuilder()
+ .setUpdatedMeter(new UpdatedMeterBuilder().setMeterId(new MeterId(DUMMY_METTER_ID)).build())
+ .setOriginalMeter(new OriginalMeterBuilder().setMeterId(new MeterId(DUMMY_METTER_ID)).build())
+ .build());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testRemoveMeter() {
- removeMeter();
- }
-
-
- private void removeMeter() {
- final MeterId dummyMeterId = new MeterId(DUMMY_METER_ID);
- RemoveMeterInput removeMeterInput = new RemoveMeterInputBuilder().setMeterId(dummyMeterId).build();
this.<RemoveMeterOutput>mockSuccessfulFuture();
- salMeterService.removeMeter(removeMeterInput);
+ removeMeter.invoke(new RemoveMeterInputBuilder().setMeterId(new MeterId(DUMMY_METER_ID)).build());
verify(mockedRequestContextStack).createRequestContext();
}
}
\ No newline at end of file
* 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.sal;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
-import com.google.common.collect.Lists;
-import java.util.Iterator;
import java.util.List;
-import java.util.concurrent.Future;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeter;
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.AddMeterOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
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.service.rev130918.UpdateMeterOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.OriginalBatchedMeterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.UpdatedBatchedMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.output.list.grouping.BatchFailedMetersOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
*/
@RunWith(MockitoJUnitRunner.class)
public class SalMetersBatchServiceImplTest {
-
public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
public static final NodeRef NODE_REF =
new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
@Mock
- private SalMeterService salMeterService;
+ private AddMeter addMeter;
+ @Mock
+ private RemoveMeter removeMeter;
+ @Mock
+ private UpdateMeter updateMeter;
@Mock
- private FlowCapableTransactionService transactionService;
+ private SendBarrier sendBarrier;
@Captor
private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
@Captor
@Captor
private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
- private SalMetersBatchServiceImpl salMetersBatchService;
+ private AddMetersBatchImpl addMetersBatch;
+ private RemoveMetersBatchImpl removeMetersBatch;
+ private UpdateMetersBatchImpl updateMetersBatch;
@Before
public void setUp() {
- salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
+ addMetersBatch = new AddMetersBatchImpl(addMeter, sendBarrier);
+ removeMetersBatch = new RemoveMetersBatchImpl(removeMeter, sendBarrier);
+ updateMetersBatch = new UpdateMetersBatchImpl(updateMeter, sendBarrier);
- Mockito.when(transactionService.sendBarrier(any()))
- .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
+ when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
+ verifyNoMoreInteractions(addMeter, removeMeter, updateMeter, sendBarrier);
}
@Test
public void testUpdateMetersBatch_success() throws Exception {
- Mockito.when(salMeterService.updateMeter(Mockito.any()))
+ when(updateMeter.invoke(any()))
.thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
- final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
+ final var input = new UpdateMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
- .setBatchUpdateMeters(Lists.newArrayList(
+ .setBatchUpdateMeters(List.of(
createEmptyBatchUpdateMeter(42L),
createEmptyBatchUpdateMeter(44L)))
.build();
- final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
+ final var resultFuture = updateMetersBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
- inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
- final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
+ final var inOrder = inOrder(updateMeter, sendBarrier);
+ inOrder.verify(updateMeter, times(2)).invoke(updateMeterInputCpt.capture());
+ final var allValues = updateMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
+ assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testUpdateMetersBatch_failure() throws Exception {
- Mockito.when(salMeterService.updateMeter(Mockito.any()))
+ when(updateMeter.invoke(any()))
.thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
.withError(ErrorType.APPLICATION, "ur-groupUpdateError")
.buildFuture());
- final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
+ final var input = new UpdateMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
- .setBatchUpdateMeters(Lists.newArrayList(
+ .setBatchUpdateMeters(List.of(
createEmptyBatchUpdateMeter(42L),
createEmptyBatchUpdateMeter(44L)))
.build();
- final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
- Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
+ final var resultFuture = updateMetersBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
.values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
- Assert.assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(45L,iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
+ assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
+ assertEquals(45L,iterator.next().getMeterId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
- inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
- final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
- Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
+ final var inOrder = inOrder(updateMeter, sendBarrier);
+ inOrder.verify(updateMeter, times(2)).invoke(updateMeterInputCpt.capture());
+ final var allValues = updateMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
+ assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
+ assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
+ assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
-
@Test
public void testAddMetersBatch_success() throws Exception {
- Mockito.when(salMeterService.addMeter(Mockito.any()))
+ when(addMeter.invoke(any()))
.thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
- final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
+ final var input = new AddMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddMeters(BindingMap.ordered(
createEmptyBatchAddMeter(43L)))
.build();
- final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
+ final var resultFuture = addMetersBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
- inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
- final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
+ final var inOrder = inOrder(addMeter, sendBarrier);
+ inOrder.verify(addMeter, times(2)).invoke(addMeterInputCpt.capture());
+ final var allValues = addMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testAddMetersBatch_failure() throws Exception {
- Mockito.when(salMeterService.addMeter(Mockito.any()))
+ when(addMeter.invoke(any()))
.thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
.withError(ErrorType.APPLICATION, "ut-groupAddError")
.buildFuture());
- final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
+ final var input = new AddMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchAddMeters(BindingMap.ordered(
createEmptyBatchAddMeter(43L)))
.build();
- final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
- Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
- .values().iterator();
+ final var resultFuture = addMetersBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
- Assert.assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(43L,iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
+ assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
+ assertEquals(43L,iterator.next().getMeterId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
- inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
- final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
+ final var inOrder = inOrder(addMeter, sendBarrier);
+ inOrder.verify(addMeter, times(2)).invoke(addMeterInputCpt.capture());
+ final var allValues = addMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testRemoveMetersBatch_success() throws Exception {
- Mockito.when(salMeterService.removeMeter(Mockito.any()))
+ when(removeMeter.invoke(any()))
.thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
- final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
+ final var input = new RemoveMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveMeters(BindingMap.ordered(
createEmptyBatchRemoveMeter(43L)))
.build();
- final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
+ final var resultFuture = removeMetersBatch.invoke(input);
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertTrue(resultFuture.get().isSuccessful());
+ assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.get().isSuccessful());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
+ final var inOrder = inOrder(removeMeter, sendBarrier);
- inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
- final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
+ inOrder.verify(removeMeter, times(2)).invoke(removeMeterInputCpt.capture());
+ final var allValues = removeMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
@Test
public void testRemoveMetersBatch_failure() throws Exception {
- Mockito.when(salMeterService.removeMeter(Mockito.any()))
+ when(removeMeter.invoke(any()))
.thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
.withError(ErrorType.APPLICATION, "ut-groupRemoveError")
.buildFuture());
- final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
+ final var input = new RemoveMetersBatchInputBuilder()
.setNode(NODE_REF)
.setBarrierAfter(true)
.setBatchRemoveMeters(BindingMap.ordered(
createEmptyBatchRemoveMeter(43L)))
.build();
- final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
- Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
- .values().iterator();
+ final var resultFuture = removeMetersBatch.invoke(input);
+ final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
- Assert.assertTrue(resultFuture.isDone());
- Assert.assertFalse(resultFuture.get().isSuccessful());
- Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
- Assert.assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
- Assert.assertEquals(2, resultFuture.get().getErrors().size());
+ assertTrue(resultFuture.isDone());
+ assertFalse(resultFuture.get().isSuccessful());
+ assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
+ assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
+ assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
+ assertEquals(2, resultFuture.get().getErrors().size());
- final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
+ final var inOrder = inOrder(removeMeter, sendBarrier);
- inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
- final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
- Assert.assertEquals(2, allValues.size());
- Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
- Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
+ inOrder.verify(removeMeter, times(2)).invoke(removeMeterInputCpt.capture());
+ final var allValues = removeMeterInputCpt.getAllValues();
+ assertEquals(2, allValues.size());
+ assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
+ assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
- inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
+ inOrder.verify(sendBarrier).invoke(any());
}
private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
+import org.eclipse.jdt.annotation.NonNull;
import org.junit.Test;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.common.Uint32;
/**
- * Test for {@link FlowCapableTransactionServiceImpl}.
+ * Test for {@link SendBarrierImpl}.
*/
-public class FlowCapableTransactionServiceImplTest extends ServiceMocking {
-
+public class SendBarrierImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID_VALUE = Uint32.valueOf(100);
- FlowCapableTransactionServiceImpl flowCapableTransactionService;
+
+ private SendBarrierImpl sendBarrier;
@Override
protected void setup() {
- flowCapableTransactionService =
- new FlowCapableTransactionServiceImpl(mockedRequestContextStack, mockedDeviceContext);
+ sendBarrier = new SendBarrierImpl(mockedRequestContextStack, mockedDeviceContext);
}
@Test
public void testBuildRequest() {
- SendBarrierInput sendBarrierInput = buildSendBarrierInput();
-
- final OfHeader request = flowCapableTransactionService.buildRequest(new Xid(DUMMY_XID_VALUE), sendBarrierInput);
+ final var request = sendBarrier.buildRequest(new Xid(DUMMY_XID_VALUE), buildSendBarrierInput());
assertEquals(DUMMY_XID_VALUE, request.getXid());
assertTrue(request instanceof BarrierInput);
}
@Test
public void testSendBarrier() {
- SendBarrierInput sendBarrierInput = buildSendBarrierInput();
- flowCapableTransactionService.sendBarrier(sendBarrierInput);
+ sendBarrier.invoke(buildSendBarrierInput());
verify(mockedRequestContextStack).createRequestContext();
}
- private SendBarrierInput buildSendBarrierInput() {
- return new SendBarrierInputBuilder()
- .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier())).build();
+ private @NonNull SendBarrierInput buildSendBarrierInput() {
+ return new SendBarrierInputBuilder().setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier())).build();
}
}
* 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.sal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import org.junit.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
import org.opendaylight.openflowplugin.extension.api.ExtensionConvertorData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice;
import org.opendaylight.yangtools.yang.common.Uint32;
/**
- * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalExperimenterMessageServiceImpl}.
+ * Test for {@link SendExperimenterImpl}.
*/
-public class SalExperimenterMessageServiceImplTest extends ServiceMocking {
-
+public class SendExperimenterImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID_VALUE = Uint32.valueOf(100);
- private SalExperimenterMessageServiceImpl salExperimenterMessageService;
+
@Mock
private ExtensionConverterProvider extensionConverterProvider;
@Mock
private ConverterMessageToOFJava extensionConverter;
+ private SendExperimenterImpl sendExperimenter;
+
@Override
protected void setup() {
- salExperimenterMessageService = new SalExperimenterMessageServiceImpl(mockedRequestContextStack,
- mockedDeviceContext,
- extensionConverterProvider);
- Mockito.when(extensionConverterProvider.getMessageConverter(ArgumentMatchers.<TypeVersionKey>any()))
- .thenReturn(extensionConverter);
- Mockito.when(extensionConverter.getExperimenterId()).thenReturn(new ExperimenterId(Uint32.valueOf(43)));
- Mockito.when(extensionConverter.getType()).thenReturn(Uint32.valueOf(44));
+ when(extensionConverterProvider.getMessageConverter(ArgumentMatchers.<TypeVersionKey>any()))
+ .thenReturn(extensionConverter);
+ when(extensionConverter.getExperimenterId()).thenReturn(new ExperimenterId(Uint32.valueOf(43)));
+ when(extensionConverter.getType()).thenReturn(Uint32.valueOf(44));
+
+ sendExperimenter = new SendExperimenterImpl(mockedRequestContextStack, mockedDeviceContext,
+ extensionConverterProvider);
}
@Test
public void testSendExperimenter() {
- SendExperimenterInput sendExperimenterInput = buildSendExperimenterInput();
- salExperimenterMessageService.sendExperimenter(sendExperimenterInput);
+ sendExperimenter.invoke(buildSendExperimenterInput());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testBuildRequest() throws Exception {
- SendExperimenterInput sendExperimenterInput = buildSendExperimenterInput();
- final OfHeader request =
- salExperimenterMessageService.buildRequest(new Xid(DUMMY_XID_VALUE), sendExperimenterInput);
+ final var sendExperimenterInput = buildSendExperimenterInput();
+ final var request = sendExperimenter.buildRequest(new Xid(DUMMY_XID_VALUE), sendExperimenterInput);
assertEquals(DUMMY_XID_VALUE, request.getXid());
assertTrue(request instanceof ExperimenterInput);
- final ExperimenterInput input = (ExperimenterInput) request;
+ final var input = (ExperimenterInput) request;
assertEquals(43L, input.getExperimenter().getValue().longValue());
assertEquals(44L, input.getExpType().longValue());
- Mockito.verify(extensionConverter).convert(eq(sendExperimenterInput.getExperimenterMessageOfChoice()),
- ArgumentMatchers.any(ExtensionConvertorData.class));
+ verify(extensionConverter).convert(eq(sendExperimenterInput.getExperimenterMessageOfChoice()),
+ any(ExtensionConvertorData.class));
}
private SendExperimenterInput buildSendExperimenterInput() {
- SendExperimenterInputBuilder sendExperimenterInputBld = new SendExperimenterInputBuilder()
- .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
- .setExperimenterMessageOfChoice(new DummyExperimenter());
- return sendExperimenterInputBld.build();
+ return new SendExperimenterInputBuilder()
+ .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
+ .setExperimenterMessageOfChoice(new DummyExperimenter())
+ .build();
}
private static final class DummyExperimenter implements ExperimenterMessageOfChoice {
* 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.sal;
import static org.mockito.Mockito.verify;
import java.util.List;
import org.junit.Test;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequestInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.mp.message.service.rev151020.SendExperimenterMpRequestInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
-public class SalExperimenterMpMessageServiceImplTest extends ServiceMocking {
- private SalExperimenterMpMessageServiceImpl salExperimenterMpMessageService;
+public class SendExperimenterMpRequestImplTest extends ServiceMocking {
+ private SendExperimenterMpRequestImpl sendExperimenterMpRequest;
@Override
protected void setup() {
this.<List<MultipartReply>>mockSuccessfulFuture();
- salExperimenterMpMessageService = new SalExperimenterMpMessageServiceImpl(
- mockedRequestContextStack,
- mockedDeviceContext,
- mockedExtensionConverterProvider);
+ sendExperimenterMpRequest = new SendExperimenterMpRequestImpl(mockedRequestContextStack, mockedDeviceContext,
+ mockedExtensionConverterProvider);
}
@Test
public void sendExperimenterMpRequest() {
- final SendExperimenterMpRequestInput data = new SendExperimenterMpRequestInputBuilder()
- .setExperimenterMessageOfChoice(mockExperimenter())
- .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
- .build();
-
- salExperimenterMpMessageService.sendExperimenterMpRequest(data);
+ sendExperimenterMpRequest.invoke(new SendExperimenterMpRequestInputBuilder()
+ .setExperimenterMessageOfChoice(mockExperimenter())
+ .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
+ .build());
verify(mockedRequestContextStack).createRequestContext();
}
}
\ No newline at end of file
import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInputBuilder;
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.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
-public class NodeConfigServiceImplTest extends ServiceMocking {
-
+public class SetConfigImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID_VALUE = Uint32.valueOf(150);
private static final SwitchConfigFlag DUMMY_FLAG = SwitchConfigFlag.FRAGNORMAL;
private static final String DUMMY_FLAG_STR = "FRAGNORMAL";
private static final Uint16 DUMMY_MISS_SEARCH_LENGTH = Uint16.valueOf(3000);
- NodeConfigServiceImpl nodeConfigService;
+
+ private SetConfigImpl setConfig;
@Test
public void testSetConfig() {
- nodeConfigService = new NodeConfigServiceImpl(mockedRequestContextStack, mockedDeviceContext);
- nodeConfigService.setConfig(dummyConfigInput());
+ setConfig = new SetConfigImpl(mockedRequestContextStack, mockedDeviceContext);
+ setConfig.invoke(dummyConfigInput());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testBuildRequest() {
- nodeConfigService = new NodeConfigServiceImpl(mockedRequestContextStack, mockedDeviceContext);
- final OfHeader request = nodeConfigService.buildRequest(new Xid(DUMMY_XID_VALUE), dummyConfigInput());
+ setConfig = new SetConfigImpl(mockedRequestContextStack, mockedDeviceContext);
+ final var request = setConfig.buildRequest(new Xid(DUMMY_XID_VALUE), dummyConfigInput());
assertTrue(request instanceof org.opendaylight.yang.gen.v1.urn
.opendaylight.openflow.protocol.rev130731.SetConfigInput);
}
private static SetConfigInput dummyConfigInput() {
- SetConfigInputBuilder setConfigInputBuilder = new SetConfigInputBuilder();
- setConfigInputBuilder.setFlag(DUMMY_FLAG_STR);
- setConfigInputBuilder.setMissSearchLength(DUMMY_MISS_SEARCH_LENGTH);
- return setConfigInputBuilder.build();
+ return new SetConfigInputBuilder()
+ .setFlag(DUMMY_FLAG_STR)
+ .setMissSearchLength(DUMMY_MISS_SEARCH_LENGTH)
+ .build();
}
}
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase;
-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.TransmitPacketInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
/**
- * Test for {@link PacketProcessingServiceImpl}.
+ * Test for {@link TransmitPacketImpl}.
*/
-public class PacketProcessingServiceImplTest extends ServiceMocking {
-
+public class TransmitPacketImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID_VALUE = Uint32.valueOf(100);
- public static final String ULTIMATE_PAYLOAD = "What do you get when you multiply six by nine?";
+ private static final String ULTIMATE_PAYLOAD = "What do you get when you multiply six by nine?";
- private PacketProcessingServiceImpl packetProcessingService;
+ private TransmitPacketImpl transmitPacket;
private KeyedInstanceIdentifier<NodeConnector, NodeConnectorKey> pathToNodeconnector;
@Override
protected void setup() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- packetProcessingService =
- new PacketProcessingServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ transmitPacket = new TransmitPacketImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
pathToNodeconnector = KeyedInstanceIdentifier.create(Nodes.class)
- .child(Node.class, new NodeKey(new NodeId("ofp-ut:123")))
- .child(NodeConnector.class, new NodeConnectorKey(new NodeConnectorId("ofp-ut:123:1")));
+ .child(Node.class, new NodeKey(new NodeId("ofp-ut:123")))
+ .child(NodeConnector.class, new NodeConnectorKey(new NodeConnectorId("ofp-ut:123:1")));
}
@Test
public void testTransmitPacket() {
- TransmitPacketInput transmitPacketInput = buildTransmitPacketInput();
- packetProcessingService.transmitPacket(transmitPacketInput);
+ transmitPacket.invoke(buildTransmitPacketInput());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testBuildRequest() {
- TransmitPacketInput transmitPacketInput = buildTransmitPacketInput();
-
- final OfHeader request = packetProcessingService.buildRequest(new Xid(DUMMY_XID_VALUE), transmitPacketInput);
+ final var request = transmitPacket.buildRequest(new Xid(DUMMY_XID_VALUE), buildTransmitPacketInput());
assertEquals(DUMMY_XID_VALUE, request.getXid());
assertTrue(request instanceof PacketOutInput);
- final PacketOutInput input = (PacketOutInput) request;
+ final var input = (PacketOutInput) request;
assertEquals(OFConstants.OFP_NO_BUFFER, input.getBufferId());
assertEquals(1, input.getAction().size());
assertEquals(OutputActionCase.class, input.getAction().get(0).getActionChoice().implementedInterface());
- final OutputActionCase actionChoice = (OutputActionCase) input.getAction().get(0).getActionChoice();
+ final var actionChoice = (OutputActionCase) input.getAction().get(0).getActionChoice();
assertEquals(1, actionChoice.getOutputAction().getPort().getValue().intValue());
assertEquals(ULTIMATE_PAYLOAD, new String(input.getData()));
}
private TransmitPacketInput buildTransmitPacketInput() {
- TransmitPacketInputBuilder transmitPacketInputBld = new TransmitPacketInputBuilder()
- .setBufferId(OFConstants.OFP_NO_BUFFER)
- .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
- .setPayload(ULTIMATE_PAYLOAD.getBytes())
- .setEgress(new NodeConnectorRef(pathToNodeconnector));
- return transmitPacketInputBld.build();
+ return new TransmitPacketInputBuilder()
+ .setBufferId(OFConstants.OFP_NO_BUFFER)
+ .setNode(new NodeRef(mockedDeviceInfo.getNodeInstanceIdentifier()))
+ .setPayload(ULTIMATE_PAYLOAD.getBytes())
+ .setEgress(new NodeConnectorRef(pathToNodeconnector))
+ .build();
}
}
*/
package org.opendaylight.openflowplugin.impl.services.sal;
+import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.verify;
import org.junit.Test;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.openflowplugin.impl.services.ServiceMocking;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.Port;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.PortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.port.update.UpdatedPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.port.update.UpdatedPortBuilder;
import org.opendaylight.yangtools.yang.binding.util.BindingMap;
import org.opendaylight.yangtools.yang.common.Uint32;
@RunWith(MockitoJUnitRunner.class)
-public class SalPortServiceImplTest extends ServiceMocking {
-
+public class UpdatePortImplTest extends ServiceMocking {
private static final Uint32 DUMMY_XID = Uint32.valueOf(55L);
private static final Uint32 DUMMY_PORT_NUMBER = Uint32.valueOf(66L);
private static final String DUMMY_MAC_ADDRESS = "AA:BB:CC:DD:EE:FF";
- SalPortServiceImpl salPortService;
+
+ private UpdatePortImpl updatePort;
@Override
protected void setup() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- salPortService = new SalPortServiceImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ updatePort = new UpdatePortImpl(mockedRequestContextStack, mockedDeviceContext, convertorManager);
}
@Test
public void testUpdatePort() {
- salPortService.updatePort(dummyUpdatePortInput());
+ updatePort.invoke(dummyUpdatePortInput());
verify(mockedRequestContextStack).createRequestContext();
}
@Test
public void testBuildRequest() {
- final OfHeader ofHeader = salPortService.buildRequest(new Xid(DUMMY_XID), dummyUpdatePortInput());
+ assertNotNull(updatePort.buildRequest(new Xid(DUMMY_XID), dummyUpdatePortInput()));
}
private static UpdatePortInput dummyUpdatePortInput() {
- org.opendaylight.yang.gen.v1.urn
- .opendaylight.flow.types.port.rev130925.port.mod.port.PortBuilder concretePortBuilder
- = new org.opendaylight.yang.gen.v1.urn
- .opendaylight.flow.types.port.rev130925.port.mod.port.PortBuilder();
- concretePortBuilder.setConfiguration(new PortConfig(true, true, true, true));
- concretePortBuilder.setAdvertisedFeatures(new PortFeatures(true, true, true, true, true, true, true, true,
- true, true, true, true, true, true, true, true));
- concretePortBuilder.setPortNumber(new PortNumberUni(DUMMY_PORT_NUMBER));
- concretePortBuilder.setHardwareAddress(new MacAddress(DUMMY_MAC_ADDRESS));
- concretePortBuilder.setPortModOrder(Uint32.ZERO);
-
- Port port = new PortBuilder().setPort(BindingMap.of(concretePortBuilder.build())).build();
- UpdatedPort updatePort = new UpdatedPortBuilder().setPort(port).build();
- return new UpdatePortInputBuilder().setUpdatedPort(updatePort).build();
+ return new UpdatePortInputBuilder()
+ .setUpdatedPort(new UpdatedPortBuilder()
+ .setPort(new PortBuilder()
+ .setPort(BindingMap.of(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925
+ .port.mod.port.PortBuilder()
+ .setConfiguration(new PortConfig(true, true, true, true))
+ .setAdvertisedFeatures(new PortFeatures(true, true, true, true, true, true, true, true, true,
+ true, true, true, true, true, true, true))
+ .setPortNumber(new PortNumberUni(DUMMY_PORT_NUMBER))
+ .setHardwareAddress(new MacAddress(DUMMY_MAC_ADDRESS))
+ .setPortModOrder(Uint32.ZERO)
+ .build()))
+ .build())
+ .build())
+ .build();
}
}
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint8;
-public class SalTableServiceImplTest extends ServiceMocking {
-
+public class UpdateTableImplTest extends ServiceMocking {
@Mock
RpcProviderService mockedRpcProviderRegistry;
private SettableFuture<Object> handleResultFuture;
- private SalTableServiceImpl salTableService;
+ private UpdateTableImpl salTableService;
@Override
public void setup() {
}).when(mockedOutboundQueue).commitEntry(any(Uint32.class), any(), any());
final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- salTableService = new SalTableServiceImpl(mockedRequestContextStack, mockedDeviceContext,
+ salTableService = new UpdateTableImpl(mockedRequestContextStack, mockedDeviceContext,
convertorManager, MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext));
}
return null;
}).when(multiMessageCollector).endCollecting(any());
- final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.updateTable(prepareUpdateTable());
+ final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.invoke(prepareUpdateTable());
Assert.assertNotNull(rpcResultFuture);
verify(mockedRequestContextStack).createRequestContext();
}
return null;
}).when(multiMessageCollector).endCollecting(any());
- final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.updateTable(prepareUpdateTable());
+ final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.invoke(prepareUpdateTable());
Assert.assertNotNull(rpcResultFuture);
verify(mockedRequestContextStack).createRequestContext();
}
return null;
}).when(multiMessageCollector).endCollecting(any());
- final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.updateTable(prepareUpdateTable());
+ final Future<RpcResult<UpdateTableOutput>> rpcResultFuture = salTableService.invoke(prepareUpdateTable());
Assert.assertNotNull(rpcResultFuture);
verify(mockedRequestContextStack).createRequestContext();
}
*/
package org.opendaylight.openflowplugin.impl.statistics.services;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTableBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
import org.opendaylight.yangtools.yang.common.Uint8;
/**
- * Test for {@link OpendaylightFlowTableStatisticsServiceImpl}.
+ * Test for {@link GetFlowTablesStatisticsImpl}.
*/
-public class OpendaylightFlowTableStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
+@Deprecated
+public class GetFlowTablesStatisticsImplTest extends AbstractSingleStatsServiceTest {
private static final Uint8 TABLE_ID = Uint8.valueOf(123);
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightFlowTableStatisticsServiceImpl flowTableStatisticsService;
+ private GetFlowTablesStatisticsImpl getFlowTablesStatistics;
@Override
public void setUp() {
- flowTableStatisticsService = new OpendaylightFlowTableStatisticsServiceImpl(rqContextStack, deviceContext,
- new AtomicLong(), notificationPublishService);
+ getFlowTablesStatistics = new GetFlowTablesStatisticsImpl(rqContextStack, deviceContext, new AtomicLong(),
+ notificationPublishService);
}
@Test
public void testGetFlowTablesStatistics() throws Exception {
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
- GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder()
+ var input = new GetFlowTablesStatisticsInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
+ rpcResult = RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyTableCaseBuilder()
.setMultipartReplyTable(new MultipartReplyTableBuilder()
- .setTableStats(Collections.singletonList(new TableStatsBuilder()
+ .setTableStats(List.of(new TableStatsBuilder()
.setActiveCount(Uint32.valueOf(31))
.setLookupCount(Uint64.valueOf(32))
.setMatchedCount(Uint64.valueOf(33))
.build()
)).build();
- final Future<RpcResult<GetFlowTablesStatisticsOutput>> resultFuture
- = flowTableStatisticsService.getFlowTablesStatistics(input.build());
+ final var resultFuture = getFlowTablesStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetFlowTablesStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPTABLE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPTABLE, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
+ verify(notificationPublishService).offerNotification(any());
}
@Test
public void testBuildRequest() {
- Xid xid = new Xid(Uint32.valueOf(42L));
- GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder()
+ final var xid = new Xid(Uint32.valueOf(42L));
+ final var input = new GetFlowTablesStatisticsInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- final OfHeader request = flowTableStatisticsService.buildRequest(xid, input.build());
- Assert.assertTrue(request instanceof MultipartRequestInput);
- final MultipartRequestInput mpRequest = (MultipartRequestInput) request;
- Assert.assertEquals(MultipartType.OFPMPTABLE, mpRequest.getType());
- Assert.assertTrue(mpRequest.getMultipartRequestBody() instanceof MultipartRequestTableCase);
- final MultipartRequestTableCase mpRequestBody =
- (MultipartRequestTableCase) mpRequest.getMultipartRequestBody();
- Assert.assertNotNull(mpRequestBody.getMultipartRequestTable().getEmpty());
+ final var request = getFlowTablesStatistics.buildRequest(xid, input.build());
+ assertTrue(request instanceof MultipartRequestInput);
+ final var mpRequest = (MultipartRequestInput) request;
+ assertEquals(MultipartType.OFPMPTABLE, mpRequest.getType());
+ assertTrue(mpRequest.getMultipartRequestBody() instanceof MultipartRequestTableCase);
+ final var mpRequestBody = (MultipartRequestTableCase) mpRequest.getMultipartRequestBody();
+ assertNotNull(mpRequestBody.getMultipartRequestTable().getEmpty());
}
}
+++ /dev/null
-/*
- * 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 java.util.concurrent.Future;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.opendaylight.openflowplugin.impl.rpc.AbstractRequestContext;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.Uint16;
-import org.opendaylight.yangtools.yang.common.Uint32;
-import org.opendaylight.yangtools.yang.common.Uint8;
-
-/**
- * Test for {@link OpendaylightFlowStatisticsServiceImpl} - only delegated methods (failing).
- */
-public class OpendaylightFlowStatisticsServiceImpl1Test extends AbstractStatsServiceTest {
-
- @Captor
- private ArgumentCaptor<MultipartRequestInput> requestInput;
-
- private OpendaylightFlowStatisticsServiceImpl flowStatisticsService;
-
- @Override
- public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- flowStatisticsService =
- OpendaylightFlowStatisticsServiceImpl.createWithOook(rqContextStack, deviceContext, convertorManager);
-
- AbstractRequestContext<Object> rqContext = new AbstractRequestContext<>(Uint32.valueOf(42)) {
- @Override
- public void close() {
- //NOOP
- }
- };
- //Mockito.when(rqContextStack.<Object>createRequestContext()).thenReturn(rqContext);
- }
-
- @Test(expected = IllegalAccessError.class)
- public void testGetAggregateFlowStatisticsFromFlowTableForAllFlows() {
- GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder input =
- new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setTableId(new TableId(Uint8.ONE));
-
- flowStatisticsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build());
- }
-
- @Test(expected = IllegalAccessError.class)
- public void testGetAllFlowStatisticsFromFlowTable() {
- GetAllFlowStatisticsFromFlowTableInputBuilder input = new GetAllFlowStatisticsFromFlowTableInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setTableId(new TableId(Uint8.ONE));
-
- flowStatisticsService.getAllFlowStatisticsFromFlowTable(input.build());
- }
-
- @Test(expected = IllegalAccessError.class)
- public void testGetAllFlowsStatisticsFromAllFlowTables() {
- GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input =
- new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder()
- .setNode(createNodeRef("unitProt:123"));
-
- flowStatisticsService.getAllFlowsStatisticsFromAllFlowTables(input.build());
- }
-
- @Test(expected = IllegalAccessError.class)
- public void testGetFlowStatisticsFromFlowTable() {
- GetFlowStatisticsFromFlowTableInputBuilder input = new GetFlowStatisticsFromFlowTableInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setPriority(Uint16.valueOf(5));
-
- final Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> resultFuture
- = flowStatisticsService.getFlowStatisticsFromFlowTable(input.build());
- }
-}
\ No newline at end of file
* 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.when;
-import com.google.common.util.concurrent.FutureCallback;
import java.util.Collections;
import java.util.List;
-import java.util.concurrent.Future;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
import org.opendaylight.openflowplugin.impl.rpc.AbstractRequestContext;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
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.flow.statistics.rev130819.get.aggregate.flow.statistics.from.flow.table._for.given.match.output.AggregatedFlowStatisticsBuilder;
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.MultipartReplyMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
-import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
* Test for {@link OpendaylightFlowStatisticsServiceImpl} - only not delegated method.
*/
public class OpendaylightFlowStatisticsServiceImpl2Test extends AbstractStatsServiceTest {
-
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
@Mock
private AbstractRequestContext<List<MultipartReply>> rqContextMp;
- private OpendaylightFlowStatisticsServiceImpl flowStatisticsService;
-
+ private GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl
+ getAggregateFlowStatisticsFromFlowTableForGivenMatch;
@Override
public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- flowStatisticsService = OpendaylightFlowStatisticsServiceImpl.createWithOook(rqContextStack,
- deviceContext,
- convertorManager);
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ getAggregateFlowStatisticsFromFlowTableForGivenMatch =
+ new GetAggregateFlowStatisticsFromFlowTableForGivenMatchImpl(rqContextStack, deviceContext,
+ convertorManager);
rqContextMp = new AbstractRequestContext<>(Uint32.valueOf(42L)) {
@Override
//NOOP
}
};
- Mockito.when(rqContextStack.<List<MultipartReply>>createRequestContext()).thenReturn(rqContextMp);
- Mockito.when(translatorLibrary
- .<MultipartReply, AggregatedFlowStatistics>lookupTranslator(Mockito.any()))
+ when(rqContextStack.<List<MultipartReply>>createRequestContext()).thenReturn(rqContextMp);
+ when(translatorLibrary.<MultipartReply, AggregatedFlowStatistics>lookupTranslator(any()))
.thenReturn(translator);
}
@Test
public void testGetAggregateFlowStatisticsFromFlowTableForGivenMatch() throws Exception {
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
- .commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), Mockito.<FutureCallback>any());
- Mockito.doAnswer((Answer<Void>) invocation -> {
- final MultipartReplyMessageBuilder messageBuilder = new MultipartReplyMessageBuilder()
- .setVersion(EncodeConstants.OF_VERSION_1_3);
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ .commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any());
+ doAnswer((Answer<Void>) invocation -> {
+ final var messageBuilder = new MultipartReplyMessageBuilder().setVersion(EncodeConstants.OF_VERSION_1_3);
rqContextMp.setResult(RpcResultBuilder
.success(Collections.<MultipartReply>singletonList(messageBuilder.build()))
.build());
return null;
- }).when(multiMsgCollector).endCollecting(Mockito.any());
- Mockito.when(translator.translate(
- Mockito.any(), same(deviceInfo), isNull())
- ).thenReturn(new AggregatedFlowStatisticsBuilder().build());
+ }).when(multiMsgCollector).endCollecting(any());
+ when(translator.translate(any(), same(deviceInfo), isNull()))
+ .thenReturn(new AggregatedFlowStatisticsBuilder().build());
- GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder input =
+ final var input =
new GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder()
.setNode(createNodeRef("unitProt:123"))
.setPriority(Uint16.valueOf(5))
.setTableId(Uint8.ONE);
- final Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> resultFuture
- = flowStatisticsService.getAggregateFlowStatisticsFromFlowTableForGivenMatch(input.build());
+ final var resultFuture = getAggregateFlowStatisticsFromFlowTableForGivenMatch.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(1, rpcResult.getResult().getAggregatedFlowStatistics().size());
- Assert.assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(1, rpcResult.getResult().getAggregatedFlowStatistics().size());
+ assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
}
}
\ No newline at end of file
+++ /dev/null
-/*
- * 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.junit.Test;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
-import org.opendaylight.yangtools.yang.common.Uint16;
-import org.opendaylight.yangtools.yang.common.Uint8;
-
-/**
- * Test for {@link OpendaylightFlowStatisticsServiceImpl} - only delegated methods.
- */
-public class OpendaylightFlowStatisticsServiceImpl3Test extends AbstractStatsServiceTest {
-
- @Mock
- private OpendaylightFlowStatisticsService flowStatisticsDelegate;
-
- private OpendaylightFlowStatisticsServiceImpl flowStatisticsService;
-
- @Override
- public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- flowStatisticsService =
- OpendaylightFlowStatisticsServiceImpl.createWithOook(rqContextStack, deviceContext, convertorManager);
- flowStatisticsService.setDelegate(flowStatisticsDelegate);
- }
-
- @Test
- public void testGetAggregateFlowStatisticsFromFlowTableForAllFlows() {
- GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input =
- new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setTableId(new TableId(Uint8.ONE))
- .build();
-
- flowStatisticsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input);
- Mockito.verify(flowStatisticsDelegate).getAggregateFlowStatisticsFromFlowTableForAllFlows(input);
- }
-
- @Test
- public void testGetAllFlowStatisticsFromFlowTable() {
- GetAllFlowStatisticsFromFlowTableInput input = new GetAllFlowStatisticsFromFlowTableInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setTableId(new TableId(Uint8.ONE))
- .build();
-
- flowStatisticsService.getAllFlowStatisticsFromFlowTable(input);
- Mockito.verify(flowStatisticsDelegate).getAllFlowStatisticsFromFlowTable(input);
- }
-
- @Test
- public void testGetAllFlowsStatisticsFromAllFlowTables() {
- GetAllFlowsStatisticsFromAllFlowTablesInput input = new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .build();
-
- flowStatisticsService.getAllFlowsStatisticsFromAllFlowTables(input);
- Mockito.verify(flowStatisticsDelegate).getAllFlowsStatisticsFromAllFlowTables(input);
- }
-
- @Test
- public void testGetFlowStatisticsFromFlowTable() {
- GetFlowStatisticsFromFlowTableInput input = new GetFlowStatisticsFromFlowTableInputBuilder()
- .setNode(createNodeRef("unitProt:123"))
- .setPriority(Uint16.valueOf(5))
- .build();
-
- flowStatisticsService.getFlowStatisticsFromFlowTable(input);
- Mockito.verify(flowStatisticsDelegate).getFlowStatisticsFromFlowTable(input);
- }
-}
*/
package org.opendaylight.openflowplugin.impl.statistics.services;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
-/**
- * Test for {@link OpendaylightGroupStatisticsServiceImpl}.
- */
+@Deprecated
public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
-
private static final org.opendaylight.yang.gen.v1.urn
.opendaylight.openflow.common.types.rev130731.GroupId GROUP_ID = new org.opendaylight.yang.gen.v1.urn
.opendaylight.openflow.common.types.rev130731.GroupId(Uint32.valueOf(123));
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightGroupStatisticsServiceImpl groupStatisticsService;
+ private GetAllGroupStatisticsImpl getAllGroupStatistics;
+ private GetGroupStatisticsImpl getGroupStatistics;
+ private GetGroupDescriptionImpl getGroupDescription;
+ private GetGroupFeaturesImpl getGroupFeatures;
@Override
public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- groupStatisticsService = new OpendaylightGroupStatisticsServiceImpl(rqContextStack, deviceContext,
- new AtomicLong(), notificationPublishService, convertorManager);
-
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ final var xid = new AtomicLong();
+ getAllGroupStatistics = new GetAllGroupStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+ getGroupStatistics = new GetGroupStatisticsImpl(rqContextStack, deviceContext, xid, notificationPublishService,
+ convertorManager);
+ getGroupDescription = new GetGroupDescriptionImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+ getGroupFeatures = new GetGroupFeaturesImpl(rqContextStack, deviceContext, xid, notificationPublishService,
+ convertorManager);
+
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
}
@After
public void tearDown() {
- Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
+ verify(notificationPublishService).offerNotification(any());
}
@Test
rpcResult = buildGroupStatsResponse();
- final Future<RpcResult<GetAllGroupStatisticsOutput>> resultFuture
- = groupStatisticsService.getAllGroupStatistics(input.build());
+ final var resultFuture = getAllGroupStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllGroupStatisticsOutput> rpcResultCompatible = resultFuture.get();
- Assert.assertTrue(rpcResultCompatible.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResultCompatible = resultFuture.get();
+ assertTrue(rpcResultCompatible.isSuccessful());
+ assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
}
@Test
GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
- new MultipartReplyMessageBuilder()
- .setVersion(EncodeConstants.OF_VERSION_1_3)
- .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
- .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
- .setGroupDesc(Collections.singletonList(new GroupDescBuilder()
- .setGroupId(GROUP_ID)
- .setBucketsList(Collections.singletonList(new BucketsListBuilder()
- .setWatchGroup(Uint32.valueOf(51))
- .setWatchPort(new PortNumber(Uint32.valueOf(52)))
- .setWeight(Uint16.valueOf(53))
- .build()))
- .setType(GroupType.OFPGTALL)
- .build()))
- .build())
- .build())
- .build()
+ rpcResult = RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
+ .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
+ .setGroupDesc(List.of(new GroupDescBuilder()
+ .setGroupId(GROUP_ID)
+ .setBucketsList(List.of(new BucketsListBuilder()
+ .setWatchGroup(Uint32.valueOf(51))
+ .setWatchPort(new PortNumber(Uint32.valueOf(52)))
+ .setWeight(Uint16.valueOf(53))
+ .build()))
+ .setType(GroupType.OFPGTALL)
+ .build()))
+ .build())
+ .build())
+ .build()
)).build();
- final Future<RpcResult<GetGroupDescriptionOutput>> resultFuture
- = groupStatisticsService.getGroupDescription(input.build());
+ final var resultFuture = getGroupDescription.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetGroupDescriptionOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPGROUPDESC, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPGROUPDESC, requestInput.getValue().getType());
}
@Test
GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
- new MultipartReplyMessageBuilder()
- .setVersion(EncodeConstants.OF_VERSION_1_3)
- .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
- .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
- .setActionsBitmap(Collections.singletonList(new ActionType(true,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false)))
- .setCapabilities(new GroupCapabilities(true, false, false, false))
- .setTypes(new GroupTypes(true, false, false, false))
- .setMaxGroups(Collections.singletonList(Uint32.valueOf(5L)))
- .build())
- .build())
- .build()
+ rpcResult = RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
+ .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
+ .setActionsBitmap(List.of(new ActionType(true, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false)))
+ .setCapabilities(new GroupCapabilities(true, false, false, false))
+ .setTypes(new GroupTypes(true, false, false, false))
+ .setMaxGroups(List.of(Uint32.valueOf(5L)))
+ .build())
+ .build())
+ .build()
)).build();
- final Future<RpcResult<GetGroupFeaturesOutput>> resultFuture
- = groupStatisticsService.getGroupFeatures(input.build());
+ final var resultFuture = getGroupFeatures.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetGroupFeaturesOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
}
@Test
rpcResult = buildGroupStatsResponse();
- final Future<RpcResult<GetGroupStatisticsOutput>> resultFuture
- = groupStatisticsService.getGroupStatistics(input.build());
+ final var resultFuture = getGroupStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetGroupStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
}
private static RpcResult<Object> buildGroupStatsResponse() {
- return RpcResultBuilder.<Object>success(Collections.singletonList(
- new MultipartReplyMessageBuilder()
- .setVersion(EncodeConstants.OF_VERSION_1_3)
- .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
- .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
- .setGroupStats(Collections.singletonList(new GroupStatsBuilder()
- .setByteCount(Uint64.valueOf(21))
- .setPacketCount(Uint64.valueOf(22))
- .setRefCount(Uint32.valueOf(23))
- .setDurationSec(Uint32.valueOf(24))
- .setDurationNsec(Uint32.valueOf(25))
- .setGroupId(GROUP_ID)
- .setBucketStats(Collections.singletonList(new BucketStatsBuilder()
- .setByteCount(Uint64.valueOf(26))
- .setPacketCount(Uint64.valueOf(27))
- .build()))
- .build()))
- .build())
- .build())
- .build()
+ return RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
+ .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
+ .setGroupStats(List.of(new GroupStatsBuilder()
+ .setByteCount(Uint64.valueOf(21))
+ .setPacketCount(Uint64.valueOf(22))
+ .setRefCount(Uint32.valueOf(23))
+ .setDurationSec(Uint32.valueOf(24))
+ .setDurationNsec(Uint32.valueOf(25))
+ .setGroupId(GROUP_ID)
+ .setBucketStats(List.of(new BucketStatsBuilder()
+ .setByteCount(Uint64.valueOf(26))
+ .setPacketCount(Uint64.valueOf(27))
+ .build()))
+ .build()))
+ .build())
+ .build())
+ .build()
)).build();
}
}
\ No newline at end of file
*/
package org.opendaylight.openflowplugin.impl.statistics.services;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
/**
* Test for {@link OpendaylightMeterStatisticsServiceImpl}.
*/
+@Deprecated
public class OpendaylightMeterStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
-
private static final org.opendaylight.yang.gen.v1.urn
.opendaylight.openflow.common.types.rev130731.MeterId METER_ID = new org.opendaylight.yang.gen.v1.urn
.opendaylight.openflow.common.types.rev130731.MeterId(Uint32.valueOf(123));
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightMeterStatisticsServiceImpl meterStatisticsService;
+ private GetAllMeterStatisticsImpl getAllMeterStatistics;
+ private GetMeterStatisticsImpl getMeterStatistics;
+ private GetAllMeterConfigStatisticsImpl getAllMeterConfigStatistics;
+ private GetMeterFeaturesImpl getMeterFeatures;
@Override
public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- meterStatisticsService = new OpendaylightMeterStatisticsServiceImpl(rqContextStack, deviceContext,
- new AtomicLong(), notificationPublishService, convertorManager);
-
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ final var xid = new AtomicLong();
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+
+ getAllMeterStatistics = new GetAllMeterStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+ getMeterStatistics = new GetMeterStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+ getAllMeterConfigStatistics = new GetAllMeterConfigStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+ getMeterFeatures = new GetMeterFeaturesImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService, convertorManager);
+
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
}
@After
public void tearDown() {
- Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
+ verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
}
@Test
GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
+ rpcResult = RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyMeterConfigCaseBuilder()
.setMultipartReplyMeterConfig(new MultipartReplyMeterConfigBuilder()
- .setMeterConfig(Collections.singletonList(new MeterConfigBuilder()
+ .setMeterConfig(List.of(new MeterConfigBuilder()
.setFlags(new MeterFlags(true, false, false, false))
.setMeterId(METER_ID)
- .setBands(Collections.singletonList(new BandsBuilder()
+ .setBands(List.of(new BandsBuilder()
.setMeterBand(new MeterBandDropCaseBuilder()
.setMeterBandDrop(new MeterBandDropBuilder()
.setBurstSize(Uint32.valueOf(61))
.build()
)).build();
- final Future<RpcResult<GetAllMeterConfigStatisticsOutput>> resultFuture
- = meterStatisticsService.getAllMeterConfigStatistics(input.build());
+ final var resultFuture = getAllMeterConfigStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPMETERCONFIG, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPMETERCONFIG, requestInput.getValue().getType());
}
@Test
rpcResult = buildMeterStatisticsReply();
- final Future<RpcResult<GetAllMeterStatisticsOutput>> resultFuture
- = meterStatisticsService.getAllMeterStatistics(input.build());
+ final var resultFuture = getAllMeterStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllMeterStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
}
@Test
GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder()
.setNode(createNodeRef("unitProt:123"));
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
+ rpcResult = RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyMeterFeaturesCaseBuilder()
.build()
)).build();
- final Future<RpcResult<GetMeterFeaturesOutput>> resultFuture
- = meterStatisticsService.getMeterFeatures(input.build());
+ final var resultFuture = getMeterFeatures.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetMeterFeaturesOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPMETERFEATURES, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPMETERFEATURES, requestInput.getValue().getType());
}
@Test
rpcResult = buildMeterStatisticsReply();
- final Future<RpcResult<GetMeterStatisticsOutput>> resultFuture
- = meterStatisticsService.getMeterStatistics(input.build());
+ final var resultFuture = getMeterStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetMeterStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
}
protected RpcResult<Object> buildMeterStatisticsReply() {
- return RpcResultBuilder.<Object>success(Collections.singletonList(
+ return RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyMeterCaseBuilder()
.setMultipartReplyMeter(new MultipartReplyMeterBuilder()
- .setMeterStats(Collections.singletonList(new MeterStatsBuilder()
+ .setMeterStats(List.of(new MeterStatsBuilder()
.setMeterId(METER_ID)
.setByteInCount(Uint64.valueOf(81))
.setDurationSec(Uint32.valueOf(82))
.setDurationNsec(Uint32.valueOf(83))
.setFlowCount(Uint32.valueOf(84))
.setPacketInCount(Uint64.valueOf(85))
- .setMeterBandStats(Collections.singletonList(new MeterBandStatsBuilder()
+ .setMeterBandStats(List.of(new MeterBandStatsBuilder()
.setByteBandCount(Uint64.valueOf(86))
.setPacketBandCount(Uint64.valueOf(87))
.build()))
* 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsOutput;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
/**
* Test for {@link OpendaylightPortStatisticsServiceImpl}.
*/
+@Deprecated
public class OpendaylightPortStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
-
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightPortStatisticsServiceImpl portStatisticsService;
+ private GetAllNodeConnectorsStatisticsImpl getAllNodeConnectorsStatistics;
+ private GetNodeConnectorStatisticsImpl getNodeConnectorStatistics;
@Override
public void setUp() {
- portStatisticsService = new OpendaylightPortStatisticsServiceImpl(rqContextStack, deviceContext,
- new AtomicLong(), notificationPublishService);
+ final var xid = new AtomicLong();
+ getAllNodeConnectorsStatistics = new GetAllNodeConnectorsStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService);
+ getNodeConnectorStatistics = new GetNodeConnectorStatisticsImpl(rqContextStack, deviceContext, xid,
+ notificationPublishService);
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
}
@After
public void tearDown() {
- Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
+ verify(notificationPublishService).offerNotification(any());
}
@Test
public void testGetAllNodeConnectorsStatistics() throws Exception {
- GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder()
- .setNode(createNodeRef("unitProt:123"));
+ var input = new GetAllNodeConnectorsStatisticsInputBuilder().setNode(createNodeRef("unitProt:123"));
rpcResult = buildPortStatisticsReply();
- final Future<RpcResult<GetAllNodeConnectorsStatisticsOutput>> resultFuture
- = portStatisticsService.getAllNodeConnectorsStatistics(input.build());
+ final var resultFuture = getAllNodeConnectorsStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.isDone());
final RpcResult<GetAllNodeConnectorsStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPPORTSTATS, requestInput.getValue().getType());
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPPORTSTATS, requestInput.getValue().getType());
}
private static RpcResult<Object> buildPortStatisticsReply() {
- return RpcResultBuilder.<Object>success(Collections.singletonList(
+ return RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyPortStatsCaseBuilder()
.setMultipartReplyPortStats(new MultipartReplyPortStatsBuilder()
- .setPortStats(Collections.singletonList(new PortStatsBuilder()
+ .setPortStats(List.of(new PortStatsBuilder()
.setDurationSec(Uint32.valueOf(90))
.setDurationNsec(Uint32.valueOf(91))
.setCollisions(Uint64.valueOf(92))
@Test
public void testGetNodeConnectorStatistics() throws Exception {
- GetNodeConnectorStatisticsInputBuilder input = new GetNodeConnectorStatisticsInputBuilder()
+ var input = new GetNodeConnectorStatisticsInputBuilder()
.setNode(createNodeRef("unitProt:123"))
.setNodeConnectorId(new NodeConnectorId("unitProt:123:321"));
rpcResult = buildPortStatisticsReply();
- final Future<RpcResult<GetNodeConnectorStatisticsOutput>> resultFuture
- = portStatisticsService.getNodeConnectorStatistics(input.build());
+ final var resultFuture = getNodeConnectorStatistics.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetNodeConnectorStatisticsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPPORTSTATS, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPPORTSTATS, requestInput.getValue().getType());
}
}
\ No newline at end of file
*/
package org.opendaylight.openflowplugin.impl.statistics.services;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueueBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
-/**
- * Test for {@link OpendaylightQueueStatisticsServiceImpl}.
- */
+@Deprecated
public class OpendaylightQueueStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
-
@Captor
private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightQueueStatisticsServiceImpl queueStatisticsService;
+ private GetAllQueuesStatisticsFromAllPortsImpl getAllQueuesStatisticsFromAllPorts;
+ private GetAllQueuesStatisticsFromGivenPortImpl getAllQueuesStatisticsFromGivenPort;
+ private GetQueueStatisticsFromGivenPortImpl getQueueStatisticsFromGivenPort;
@Override
public void setUp() {
- queueStatisticsService = new OpendaylightQueueStatisticsServiceImpl(rqContextStack, deviceContext,
- new AtomicLong(), notificationPublishService);
+ final var xid = new AtomicLong();
+ getAllQueuesStatisticsFromAllPorts = new GetAllQueuesStatisticsFromAllPortsImpl(rqContextStack, deviceContext,
+ xid, notificationPublishService);
+ getAllQueuesStatisticsFromGivenPort = new GetAllQueuesStatisticsFromGivenPortImpl(rqContextStack, deviceContext,
+ xid, notificationPublishService);
+ getQueueStatisticsFromGivenPort = new GetQueueStatisticsFromGivenPortImpl(rqContextStack, deviceContext,
+ xid, notificationPublishService);
}
@After
public void tearDown() {
- Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
+ verify(notificationPublishService).offerNotification(any());
}
@Test
public void testGetAllQueuesStatisticsFromAllPorts() throws Exception {
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
GetAllQueuesStatisticsFromAllPortsInputBuilder input = new GetAllQueuesStatisticsFromAllPortsInputBuilder()
rpcResult = buildQueueStatsReply();
- final Future<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> resultFuture
- = queueStatisticsService.getAllQueuesStatisticsFromAllPorts(input.build());
+ final var resultFuture = getAllQueuesStatisticsFromAllPorts.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllQueuesStatisticsFromAllPortsOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
}
protected RpcResult<Object> buildQueueStatsReply() {
- return RpcResultBuilder.<Object>success(Collections.singletonList(
+ return RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyQueueCaseBuilder()
.setMultipartReplyQueue(new MultipartReplyQueueBuilder()
- .setQueueStats(Collections.singletonList(new QueueStatsBuilder()
+ .setQueueStats(List.of(new QueueStatsBuilder()
.setDurationSec(Uint32.valueOf(41))
.setDurationNsec(Uint32.valueOf(42))
.setTxBytes(Uint64.valueOf(43))
@Test
public void testGetAllQueuesStatisticsFromGivenPort() throws Exception {
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
GetAllQueuesStatisticsFromGivenPortInputBuilder input = new GetAllQueuesStatisticsFromGivenPortInputBuilder()
rpcResult = buildQueueStatsReply();
- final Future<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> resultFuture
- = queueStatisticsService.getAllQueuesStatisticsFromGivenPort(input.build());
+ final var resultFuture = getAllQueuesStatisticsFromGivenPort.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllQueuesStatisticsFromGivenPortOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
}
@Test
public void testGetQueueStatisticsFromGivenPort() throws Exception {
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
GetQueueStatisticsFromGivenPortInputBuilder input = new GetQueueStatisticsFromGivenPortInputBuilder()
rpcResult = buildQueueStatsReply();
- final Future<RpcResult<GetQueueStatisticsFromGivenPortOutput>> resultFuture
- = queueStatisticsService.getQueueStatisticsFromGivenPort(input.build());
+ final var resultFuture = getQueueStatisticsFromGivenPort.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetQueueStatisticsFromGivenPortOutput> rpcResult = resultFuture.get();
- Assert.assertTrue(rpcResult.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResult = resultFuture.get();
+ assertTrue(rpcResult.isSuccessful());
+ assertEquals(MultipartType.OFPMPQUEUE, requestInput.getValue().getType());
}
}
\ No newline at end of file
*/
package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
-import java.util.Collections;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
return null;
};
- Mockito.lenient().when(featuresOutput.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
- Mockito.when(rqContextStack.createRequestContext()).thenReturn(rqContext);
- Mockito.lenient().when(deviceContext.getDeviceState()).thenReturn(deviceState);
- Mockito.when(deviceContext.getDeviceInfo()).thenReturn(deviceInfo);
- Mockito.when(deviceInfo.getNodeId()).thenReturn(NODE_ID);
- Mockito.when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
- Mockito.doAnswer(closeRequestFutureAnswer).when(multiMsgCollector).endCollecting(null);
- Mockito.lenient().doAnswer(closeRequestFutureAnswer).when(multiMsgCollector)
+ lenient().when(featuresOutput.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
+ when(rqContextStack.createRequestContext()).thenReturn(rqContext);
+ lenient().when(deviceContext.getDeviceState()).thenReturn(deviceState);
+ when(deviceContext.getDeviceInfo()).thenReturn(deviceInfo);
+ when(deviceInfo.getNodeId()).thenReturn(NODE_ID);
+ when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
+ doAnswer(closeRequestFutureAnswer).when(multiMsgCollector).endCollecting(null);
+ lenient().doAnswer(closeRequestFutureAnswer).when(multiMsgCollector)
.endCollecting(any(EventIdentifier.class));
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
- Mockito.when(translatorLibrary.lookupTranslator(any(TranslatorKey.class))).thenReturn(translator);
+ when(translatorLibrary.lookupTranslator(any(TranslatorKey.class))).thenReturn(translator);
- service = AggregateFlowsInTableService.createWithOook(rqContextStack, deviceContext, new AtomicLong(20L));
+ service = new AggregateFlowsInTableService(rqContextStack, deviceContext, new AtomicLong(20L));
}
@Test
public void testGetOfVersion() {
- Assert.assertEquals(OFConstants.OFP_VERSION_1_3, service.getOfVersion().getVersion());
+ assertEquals(OFConstants.OFP_VERSION_1_3, service.getOfVersion().getVersion());
}
@Test
.setTableId(new TableId(Uint8.ONE))
.build();
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
+ rpcResult = RpcResultBuilder.<Object>success(List.of(
new MultipartReplyMessageBuilder()
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setMultipartReplyBody(new MultipartReplyAggregateCaseBuilder()
.setFlowCount(new Counter32(Uint32.valueOf(12)))
.setPacketCount(new Counter64(Uint64.valueOf(13)))
.build();
- Mockito.when(translator.translate(any(MultipartReply.class), eq(deviceInfo), any()))
+ when(translator.translate(any(MultipartReply.class), eq(deviceInfo), any()))
.thenReturn(aggregatedStats);
ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> resultFuture =
service.handleAndNotify(input, notificationPublishService);
- Assert.assertTrue(resultFuture.isDone());
+ assertTrue(resultFuture.isDone());
final RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput> result = resultFuture.get();
- Assert.assertTrue(result.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService, Mockito.timeout(500))
+ assertTrue(result.isSuccessful());
+ assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
+ verify(notificationPublishService, timeout(500))
.offerNotification(any(AggregateFlowStatisticsUpdate.class));
}
}
*/
package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.common.util.concurrent.FutureCallback;
-import java.util.Collections;
-import java.util.concurrent.Future;
+import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
-import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
import org.opendaylight.openflowplugin.impl.statistics.services.AbstractSingleStatsServiceTest;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.aggregate.flow.statistics.from.flow.table._for.given.match.output.AggregatedFlowStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;
import org.opendaylight.yangtools.yang.common.Uint8;
/**
- * Test for {@link OpendaylightFlowStatisticsServiceDelegateImpl}.
+ * Test for {@link GetFlowStatisticsFromFlowTableImpl}.
* Skipping notification verification. This will be tested in tests of underlying single task oriented services.
*/
public class OpendaylightFlowStatisticsServiceDelegateImplTest extends AbstractSingleStatsServiceTest {
-
public static final int NOTIFICATION_WAIT_TIMEOUT_MS = 500;
- @Captor
- private ArgumentCaptor<MultipartRequestInput> requestInput;
- private OpendaylightFlowStatisticsServiceDelegateImpl flowStatisticsServiceDelegate;
@Mock
private MessageTranslator<Object, Object> translator;
+ @Captor
+ private ArgumentCaptor<MultipartRequestInput> requestInput;
+
+ private GetFlowStatisticsFromFlowTableImpl getFlowStatisticsFromFlowTable;
+ private GetAllFlowStatisticsFromFlowTableImpl getAllFlowStatisticsFromFlowTable;
+ private GetAllFlowsStatisticsFromAllFlowTablesImpl getAllFlowsStatisticsFromAllFlowTables;
+ private GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl getAggregateFlowStatisticsFromFlowTableForAllFlows;
@Override
public void setUp() {
- final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- flowStatisticsServiceDelegate = new OpendaylightFlowStatisticsServiceDelegateImpl(
- rqContextStack, deviceContext, notificationPublishService, new AtomicLong(21), convertorManager);
-
- Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
+ final var convertorManager = ConvertorManagerFactory.createDefaultManager();
+ final var xid = new AtomicLong(21);
+ getFlowStatisticsFromFlowTable = new GetFlowStatisticsFromFlowTableImpl(
+ rqContextStack, deviceContext, convertorManager, xid, notificationPublishService);
+ getAllFlowStatisticsFromFlowTable = new GetAllFlowStatisticsFromFlowTableImpl(
+ rqContextStack, deviceContext, convertorManager, xid, notificationPublishService);
+ getAllFlowsStatisticsFromAllFlowTables = new GetAllFlowsStatisticsFromAllFlowTablesImpl(
+ rqContextStack, deviceContext, convertorManager, xid, notificationPublishService);
+ getAggregateFlowStatisticsFromFlowTableForAllFlows = new GetAggregateFlowStatisticsFromFlowTableForAllFlowsImpl(
+ rqContextStack, deviceContext, convertorManager, xid, notificationPublishService);
+
+ doAnswer(answerVoidToCallback).when(outboundQueueProvider)
.commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
- Mockito.when(translatorLibrary.lookupTranslator(ArgumentMatchers.any())).thenReturn(translator);
- }
-
- @Test(expected = IllegalAccessError.class)
- public void testGetAggregateFlowStatisticsFromFlowTableForGivenMatch() {
- flowStatisticsServiceDelegate.getAggregateFlowStatisticsFromFlowTableForGivenMatch(null);
+ when(translatorLibrary.lookupTranslator(any())).thenReturn(translator);
}
@Test
.setNode(createNodeRef("unitProt:123"))
.setTableId(new TableId(Uint8.ONE));
- Mockito.when(translator.translate(any(MultipartReply.class), eq(deviceInfo),any()))
+ when(translator.translate(any(MultipartReply.class), eq(deviceInfo),any()))
.thenReturn(new AggregatedFlowStatisticsBuilder()
.setByteCount(new Counter64(Uint64.valueOf(50)))
.setPacketCount(new Counter64(Uint64.valueOf(51)))
.setFlowCount(new Counter32(Uint32.valueOf(52)))
.build());
- rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(new MultipartReplyMessageBuilder()
+ rpcResult = RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
.setType(MultipartType.OFPMPAGGREGATE)
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setFlags(new MultipartRequestFlags(false))
.build()))
.build();
- final Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> resultFuture
- = flowStatisticsServiceDelegate.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build());
+ final var resultFuture = getAggregateFlowStatisticsFromFlowTableForAllFlows.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput> rpcResultCompatible =
- resultFuture.get();
- Assert.assertTrue(rpcResultCompatible.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResultCompatible = resultFuture.get();
+ assertTrue(rpcResultCompatible.isSuccessful());
+ assertEquals(MultipartType.OFPMPAGGREGATE, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService, Mockito.timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
+ verify(notificationPublishService, timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
.offerNotification(any(Notification.class));
}
rpcResult = buildFlowStatsReply();
- final Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> resultFuture
- = flowStatisticsServiceDelegate.getAllFlowStatisticsFromFlowTable(input.build());
+ final var resultFuture = getAllFlowStatisticsFromFlowTable.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllFlowStatisticsFromFlowTableOutput> rpcResultCompatible = resultFuture.get();
- Assert.assertTrue(rpcResultCompatible.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResultCompatible = resultFuture.get();
+ assertTrue(rpcResultCompatible.isSuccessful());
+ assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService, Mockito.timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
+ verify(notificationPublishService, timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
.offerNotification(any(Notification.class));
}
private static RpcResult<Object> buildFlowStatsReply() {
- return RpcResultBuilder.<Object>success(Collections.singletonList(new MultipartReplyMessageBuilder()
+ return RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
.setType(MultipartType.OFPMPFLOW)
.setVersion(EncodeConstants.OF_VERSION_1_3)
.setFlags(new MultipartRequestFlags(false))
.setMultipartReplyBody(new MultipartReplyFlowCaseBuilder()
.setMultipartReplyFlow(new MultipartReplyFlowBuilder()
- .setFlowStats(Collections.singletonList(new FlowStatsBuilder()
+ .setFlowStats(List.of(new FlowStatsBuilder()
.setTableId(Uint8.valueOf(123))
.setDurationSec(Uint32.TEN)
.setDurationNsec(Uint32.valueOf(11))
.setPacketCount(Uint64.valueOf(13))
.setCookie(Uint64.ZERO)
.setPriority(Uint16.valueOf(14))
- .setMatch(new MatchBuilder().setMatchEntry(Collections.emptyList()).build())
+ .setMatch(new MatchBuilder().setMatchEntry(List.of()).build())
.setHardTimeout(Uint16.valueOf(15))
.setIdleTimeout(Uint16.valueOf(16))
.setFlags(new FlowModFlags(true, false, false, false, false))
- .setInstruction(Collections.singletonList(new InstructionBuilder()
+ .setInstruction(List.of(new InstructionBuilder()
.setInstructionChoice(new ApplyActionsCaseBuilder()
.setApplyActions(new ApplyActionsBuilder()
- .setAction(Collections.singletonList(new ActionBuilder()
+ .setAction(List.of(new ActionBuilder()
.setActionChoice(new OutputActionCaseBuilder()
.setOutputAction(new OutputActionBuilder()
.setMaxLength(Uint16.valueOf(17))
.build())
.build())
.build()))
- .build();
+ .build();
}
@Test
rpcResult = buildFlowStatsReply();
- final Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> resultFuture
- = flowStatisticsServiceDelegate.getAllFlowsStatisticsFromAllFlowTables(input.build());
+ final var resultFuture = getAllFlowsStatisticsFromAllFlowTables.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput> rpcResultCompatible = resultFuture.get();
- Assert.assertTrue(rpcResultCompatible.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResultCompatible = resultFuture.get();
+ assertTrue(rpcResultCompatible.isSuccessful());
+ assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService, Mockito.timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
+ verify(notificationPublishService, timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
.offerNotification(any(Notification.class));
}
rpcResult = buildFlowStatsReply();
- final Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> resultFuture
- = flowStatisticsServiceDelegate.getFlowStatisticsFromFlowTable(input.build());
+ final var resultFuture = getFlowStatisticsFromFlowTable.invoke(input.build());
- Assert.assertTrue(resultFuture.isDone());
- final RpcResult<GetFlowStatisticsFromFlowTableOutput> rpcResultCompatible = resultFuture.get();
- Assert.assertTrue(rpcResultCompatible.isSuccessful());
- Assert.assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
+ assertTrue(resultFuture.isDone());
+ final var rpcResultCompatible = resultFuture.get();
+ assertTrue(rpcResultCompatible.isSuccessful());
+ assertEquals(MultipartType.OFPMPFLOW, requestInput.getValue().getType());
- Mockito.verify(notificationPublishService, Mockito.timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
+ verify(notificationPublishService, timeout(NOTIFICATION_WAIT_TIMEOUT_MS))
.offerNotification(any(Notification.class));
}
}
+++ /dev/null
-/*
- * 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.direct;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetMeterStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-
-@RunWith(MockitoJUnitRunner.class)
-public class OpendaylightDirectStatisticsServiceImplTest {
- @Mock
- AbstractFlowDirectStatisticsService flowDirectStatisticsService;
- @Mock
- AbstractGroupDirectStatisticsService groupDirectStatisticsService;
- @Mock
- AbstractMeterDirectStatisticsService meterDirectStatisticsService;
- @Mock
- AbstractPortDirectStatisticsService nodeConnectorDirectStatisticsService;
- @Mock
- AbstractQueueDirectStatisticsService queueDirectStatisticsService;
-
- @Mock
- GetGroupStatisticsInput getGroupStatisticsInput;
- @Mock
- GetQueueStatisticsInput getQueueStatisticsInput;
- @Mock
- GetFlowStatisticsInput getFlowStatisticsInput;
- @Mock
- GetMeterStatisticsInput getMeterStatisticsInput;
- @Mock
- GetNodeConnectorStatisticsInput getNodeConnectorStatisticsInput;
-
- private OpendaylightDirectStatisticsService service;
- private OpendaylightDirectStatisticsService emptyService;
-
- @Before
- public void setUp() {
- final OpendaylightDirectStatisticsServiceProvider provider = new OpendaylightDirectStatisticsServiceProvider();
- provider.register(AbstractFlowDirectStatisticsService.class, flowDirectStatisticsService);
- provider.register(AbstractGroupDirectStatisticsService.class, groupDirectStatisticsService);
- provider.register(AbstractMeterDirectStatisticsService.class, meterDirectStatisticsService);
- provider.register(AbstractPortDirectStatisticsService.class, nodeConnectorDirectStatisticsService);
- provider.register(AbstractQueueDirectStatisticsService.class, queueDirectStatisticsService);
-
- service = new OpendaylightDirectStatisticsServiceImpl(provider);
- emptyService = new OpendaylightDirectStatisticsServiceImpl(new OpendaylightDirectStatisticsServiceProvider());
- }
-
- @Test
- public void testGetGroupStatistics() {
- service.getGroupStatistics(getGroupStatisticsInput);
- verify(groupDirectStatisticsService).handleAndReply(getGroupStatisticsInput);
- }
-
- @Test
- public void testGetGroupStatisticsFail() throws Exception {
- RpcResult<GetGroupStatisticsOutput> result = emptyService
- .getGroupStatistics(getGroupStatisticsInput)
- .get();
-
- assertFalse(result.isSuccessful());
-
- for (RpcError error : result.getErrors()) {
- assertTrue(error.getMessage().contains(AbstractGroupDirectStatisticsService.class.getSimpleName()));
- }
-
- verify(groupDirectStatisticsService, times(0)).handleAndReply(getGroupStatisticsInput);
- }
-
- @Test
- public void testGetQueueStatistics() {
- service.getQueueStatistics(getQueueStatisticsInput);
- verify(queueDirectStatisticsService).handleAndReply(getQueueStatisticsInput);
- }
-
- @Test
- public void testGetQueueStatisticsFail() throws Exception {
- RpcResult<GetQueueStatisticsOutput> result = emptyService
- .getQueueStatistics(getQueueStatisticsInput)
- .get();
-
- assertFalse(result.isSuccessful());
-
- for (RpcError error : result.getErrors()) {
- assertTrue(error.getMessage().contains(AbstractQueueDirectStatisticsService.class.getSimpleName()));
- }
-
- verify(queueDirectStatisticsService, times(0)).handleAndReply(getQueueStatisticsInput);
- }
-
- @Test
- public void testGetFlowStatistics() {
- service.getFlowStatistics(getFlowStatisticsInput);
- verify(flowDirectStatisticsService).handleAndReply(getFlowStatisticsInput);
- }
-
- @Test
- public void testGetFlowStatisticsFail() throws Exception {
- RpcResult<GetFlowStatisticsOutput> result = emptyService
- .getFlowStatistics(getFlowStatisticsInput)
- .get();
-
- assertFalse(result.isSuccessful());
-
- for (RpcError error : result.getErrors()) {
- assertTrue(error.getMessage().contains(AbstractFlowDirectStatisticsService.class.getSimpleName()));
- }
-
- verify(flowDirectStatisticsService, times(0)).handleAndReply(getFlowStatisticsInput);
- }
-
- @Test
- public void testGetMeterStatistics() {
- service.getMeterStatistics(getMeterStatisticsInput);
- verify(meterDirectStatisticsService).handleAndReply(getMeterStatisticsInput);
- }
-
- @Test
- public void testGetMeterStatisticsFail() throws Exception {
- RpcResult<GetMeterStatisticsOutput> result = emptyService
- .getMeterStatistics(getMeterStatisticsInput)
- .get();
-
- assertFalse(result.isSuccessful());
-
- for (RpcError error : result.getErrors()) {
- assertTrue(error.getMessage().contains(AbstractMeterDirectStatisticsService.class.getSimpleName()));
- }
-
- verify(meterDirectStatisticsService, times(0)).handleAndReply(getMeterStatisticsInput);
- }
-
- @Test
- public void testGetNodeConnectorStatistics() {
- service.getNodeConnectorStatistics(getNodeConnectorStatisticsInput);
- verify(nodeConnectorDirectStatisticsService).handleAndReply(getNodeConnectorStatisticsInput);
- }
-
- @Test
- public void testGetNodeConnectorStatisticsFail() throws Exception {
- RpcResult<GetNodeConnectorStatisticsOutput> result = emptyService
- .getNodeConnectorStatistics(getNodeConnectorStatisticsInput)
- .get();
-
- assertFalse(result.isSuccessful());
-
- for (RpcError error : result.getErrors()) {
- assertTrue(error.getMessage().contains(AbstractPortDirectStatisticsService.class.getSimpleName()));
- }
-
- verify(nodeConnectorDirectStatisticsService, times(0)).handleAndReply(getNodeConnectorStatisticsInput);
- }
-}
public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
static final Uint8 TABLE_NO = Uint8.ONE;
- private FlowDirectStatisticsService service;
+ private MultiGetFlowStatistics service;
@Override
public void setUp() {
- service = new FlowDirectStatisticsService(requestContextStack,
+ service = new MultiGetFlowStatistics(requestContextStack,
deviceContext,
convertorManager,
multipartWriterProvider);
public class GroupDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
static final Uint32 GROUP_NO = Uint32.ONE;
- private GroupDirectStatisticsService service;
+ private MultiGetGroupStatistics service;
@Override
public void setUp() {
- service = new GroupDirectStatisticsService(requestContextStack,
+ service = new MultiGetGroupStatistics(requestContextStack,
deviceContext,
convertorManager,
multipartWriterProvider);
import org.opendaylight.yangtools.yang.common.Uint64;
public class MeterDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
- static final Uint32 METER_NO = Uint32.valueOf(1);
- private MeterDirectStatisticsService service;
+ private static final Uint32 METER_NO = Uint32.ONE;
+ private MultiGetMeterStatistics service;
@Override
public void setUp() {
- service = new MeterDirectStatisticsService(requestContextStack, deviceContext, convertorManager,
- multipartWriterProvider);
+ service = new MultiGetMeterStatistics(requestContextStack, deviceContext, convertorManager,
+ multipartWriterProvider);
}
@Override
import org.opendaylight.yangtools.yang.common.Uint64;
public class NodeConnectorDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
- private PortDirectStatisticsService service;
+ private MultiGetNodeConnectorStatistics service;
@Override
public void setUp() {
- service = new PortDirectStatisticsService(requestContextStack,
- deviceContext,
- convertorManager,
- multipartWriterProvider);
+ service = new MultiGetNodeConnectorStatistics(requestContextStack, deviceContext, convertorManager,
+ multipartWriterProvider);
}
@Override
import org.opendaylight.yangtools.yang.common.Uint64;
public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
- static final Uint32 QUEUE_NO = Uint32.ONE;
- private QueueDirectStatisticsService service;
+ private MultiGetQueueStatistics service;
@Override
public void setUp() {
- service = new QueueDirectStatisticsService(requestContextStack,
- deviceContext,
- convertorManager,
- multipartWriterProvider);
+ service = new MultiGetQueueStatistics(requestContextStack, deviceContext, convertorManager,
+ multipartWriterProvider);
}
@Override
final GetQueueStatisticsInput input = mock(GetQueueStatisticsInput.class);
lenient().when(input.getNode()).thenReturn(createNodeRef(NODE_ID));
- when(input.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(input.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(input.getNodeConnectorId()).thenReturn(new NodeConnectorId(NODE_ID + ":" + PORT_NO));
final MultipartRequestQueueCase body = (MultipartRequestQueueCase) ((MultipartRequestInput) service
final MultipartRequestQueue queue = body.getMultipartRequestQueue();
assertEquals(PORT_NO, queue.getPortNo());
- assertEquals(QUEUE_NO, queue.getQueueId());
+ assertEquals(Uint32.ONE, queue.getQueueId());
}
@Override
when(reply.getMultipartReplyBody()).thenReturn(queueCase);
when(queueStat.getPortNo()).thenReturn(PORT_NO);
- when(queueStat.getQueueId()).thenReturn(QUEUE_NO);
+ when(queueStat.getQueueId()).thenReturn(Uint32.ONE);
when(queueStat.getTxBytes()).thenReturn(Uint64.ONE);
when(queueStat.getTxErrors()).thenReturn(Uint64.ONE);
when(queueStat.getTxPackets()).thenReturn(Uint64.ONE);
assertTrue(output.nonnullQueueIdAndStatisticsMap().size() > 0);
final QueueIdAndStatisticsMap map = output.nonnullQueueIdAndStatisticsMap().values().iterator().next();
- assertEquals(map.getQueueId().getValue(), QUEUE_NO);
+ assertEquals(map.getQueueId().getValue(), Uint32.ONE);
assertEquals(map.getNodeConnectorId(), nodeConnectorId);
}
@Test
public void testStoreStatisticsBarePortNo() {
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
- when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(map.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("1"));
- when(map.key()).thenReturn(new QueueIdAndStatisticsMapKey(new NodeConnectorId("1"), new QueueId(QUEUE_NO)));
+ when(map.key()).thenReturn(new QueueIdAndStatisticsMapKey(new NodeConnectorId("1"), new QueueId(Uint32.ONE)));
final Map<QueueIdAndStatisticsMapKey, QueueIdAndStatisticsMap> maps = BindingMap.of(map);
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
@Override
public void testStoreStatistics() {
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
- when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(map.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("openflow:1:1"));
when(map.key()).thenReturn(new QueueIdAndStatisticsMapKey(new NodeConnectorId("openflow:1:1"),
- new QueueId(QUEUE_NO)));
+ new QueueId(Uint32.ONE)));
final Map<QueueIdAndStatisticsMapKey, QueueIdAndStatisticsMap> maps = BindingMap.of(map);
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
static final Uint8 TABLE_NO = Uint8.ONE;
- private FlowDirectStatisticsService service;
+ private SingleGetFlowStatistics service;
@Override
public void setUp() {
final DeviceFlowRegistry registry = mock(DeviceFlowRegistry.class);
- service = new FlowDirectStatisticsService(requestContextStack,
+ service = new SingleGetFlowStatistics(requestContextStack,
deviceContext,
convertorManager,
multipartWriterProvider);
public class GroupDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
static final Uint32 GROUP_NO = Uint32.ONE;
- private GroupDirectStatisticsService service;
+ private SingleGetGroupStatistics service;
@Override
public void setUp() {
- service = new GroupDirectStatisticsService(requestContextStack,
+ service = new SingleGetGroupStatistics(requestContextStack,
deviceContext,
convertorManager,
multipartWriterProvider);
public class MeterDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
static final Uint32 METER_NO = Uint32.ONE;
- private MeterDirectStatisticsService service;
+ private SingleGetMeterStatistics service;
@Override
public void setUp() {
- service = new MeterDirectStatisticsService(requestContextStack,
+ service = new SingleGetMeterStatistics(requestContextStack,
deviceContext,
convertorManager,
multipartWriterProvider);
import org.opendaylight.yangtools.yang.common.Uint32;
public class NodeConnectorDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
- private PortDirectStatisticsService service;
+ private SingleGetNodeConnectorStatistics service;
@Override
public void setUp() {
- service = new PortDirectStatisticsService(requestContextStack,
- deviceContext,
- convertorManager,
- multipartWriterProvider);
+ service = new SingleGetNodeConnectorStatistics(requestContextStack, deviceContext, convertorManager,
+ multipartWriterProvider);
}
@Override
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetQueueStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReplyBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yangtools.yang.common.Uint64;
public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
- static final Uint32 QUEUE_NO = Uint32.ONE;
- private QueueDirectStatisticsService service;
+ private SingleGetQueueStatistics service;
@Override
public void setUp() {
- service = new QueueDirectStatisticsService(requestContextStack,
- deviceContext,
- convertorManager,
- multipartWriterProvider);
+ service = new SingleGetQueueStatistics(requestContextStack, deviceContext, convertorManager,
+ multipartWriterProvider);
}
@Override
public void testBuildRequestBody() {
- final GetQueueStatisticsInput input = mock(GetQueueStatisticsInput.class);
+ final var input = mock(GetQueueStatisticsInput.class);
lenient().when(input.getNode()).thenReturn(createNodeRef(NODE_ID));
- when(input.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(input.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(input.getNodeConnectorId()).thenReturn(nodeConnectorId);
- final MultipartRequestQueueStats body = (MultipartRequestQueueStats) ((MultipartRequest) service
+ final var body = (MultipartRequestQueueStats) ((MultipartRequest) service
.buildRequest(new Xid(Uint32.valueOf(42L)), input))
.getMultipartRequestBody();
assertEquals(nodeConnectorId, body.getNodeConnectorId());
- assertEquals(QUEUE_NO, body.getQueueId().getValue());
+ assertEquals(Uint32.ONE, body.getQueueId().getValue());
}
@Override
public void testBuildReply() {
- final QueueIdAndStatisticsMap queueStats = new QueueIdAndStatisticsMapBuilder()
- .setQueueId(new QueueId(QUEUE_NO))
- .setNodeConnectorId(new NodeConnectorId(PORT_NO.toString()))
- .setTransmittedBytes(new Counter64(Uint64.ONE))
- .setTransmissionErrors(new Counter64(Uint64.ONE))
- .setTransmittedBytes(new Counter64(Uint64.ONE))
- .build();
-
- final MultipartReply reply = new MultipartReplyBuilder()
- .setMultipartReplyBody(new MultipartReplyQueueStatsBuilder()
- .setQueueIdAndStatisticsMap(BindingMap.of(queueStats))
- .build())
- .build();
-
- final List<MultipartReply> input = List.of(reply);
- final GetQueueStatisticsOutput output = service.buildReply(input, true);
+ final var output = service.buildReply(List.of(new MultipartReplyBuilder()
+ .setMultipartReplyBody(new MultipartReplyQueueStatsBuilder()
+ .setQueueIdAndStatisticsMap(BindingMap.of(new QueueIdAndStatisticsMapBuilder()
+ .setQueueId(new QueueId(Uint32.ONE))
+ .setNodeConnectorId(new NodeConnectorId(PORT_NO.toString()))
+ .setTransmittedBytes(new Counter64(Uint64.ONE))
+ .setTransmissionErrors(new Counter64(Uint64.ONE))
+ .setTransmittedBytes(new Counter64(Uint64.ONE))
+ .build()))
+ .build())
+ .build()), true);
assertTrue(output.nonnullQueueIdAndStatisticsMap().size() > 0);
- final QueueIdAndStatisticsMap map = output.nonnullQueueIdAndStatisticsMap().values().iterator().next();
- assertEquals(map.getQueueId().getValue(), QUEUE_NO);
+ final var map = output.nonnullQueueIdAndStatisticsMap().values().iterator().next();
+ assertEquals(map.getQueueId().getValue(), Uint32.ONE);
assertEquals(map.getNodeConnectorId().getValue(), PORT_NO.toString());
}
@Test
public void testStoreStatisticsBarePortNo() {
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
- when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(map.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("1"));
when(map.key()).thenReturn(
- new QueueIdAndStatisticsMapKey(new NodeConnectorId("1"), new QueueId(QUEUE_NO)));
+ new QueueIdAndStatisticsMapKey(new NodeConnectorId("1"), new QueueId(Uint32.ONE)));
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
Map<QueueIdAndStatisticsMapKey, QueueIdAndStatisticsMap> stats = BindingMap.of(map);
@Override
public void testStoreStatistics() {
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
- when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
+ when(map.getQueueId()).thenReturn(new QueueId(Uint32.ONE));
when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("openflow:1:1"));
when(map.key()).thenReturn(
- new QueueIdAndStatisticsMapKey(new NodeConnectorId("openflow:1:1"), new QueueId(QUEUE_NO)));
+ new QueueIdAndStatisticsMapKey(new NodeConnectorId("openflow:1:1"), new QueueId(Uint32.ONE)));
final Map<QueueIdAndStatisticsMapKey, QueueIdAndStatisticsMap> maps = BindingMap.of(map);
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
* 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
import com.google.common.base.Function;
import com.google.common.util.concurrent.ListenableFuture;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatchers;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
*/
@RunWith(MockitoJUnitRunner.class)
public class BarrierUtilTest {
-
public static final NodeKey NODE_KEY = new NodeKey(new NodeId("ut-dummy-node"));
private static final NodeRef NODE_REF = new NodeRef(InstanceIdentifier.create(Nodes.class)
.child(Node.class, NODE_KEY));
@Mock
- private FlowCapableTransactionService transactionService;
+ private SendBarrier sendBarrier;
@Mock
private Function<Pair<RpcResult<String>, RpcResult<SendBarrierOutput>>, RpcResult<String>> compositeTransform;
@Captor
@Before
public void setUp() {
- Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
+ when(sendBarrier.invoke(any()))
.thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(transactionService, compositeTransform);
+ verifyNoMoreInteractions(sendBarrier, compositeTransform);
}
@Test
final String data = "ut-data1";
final ListenableFuture<RpcResult<String>> input = RpcResultBuilder.success(data).buildFuture();
final ListenableFuture<RpcResult<String>> chainResult =
- BarrierUtil.chainBarrier(input, NODE_REF, transactionService, compositeTransform);
+ BarrierUtil.chainBarrier(input, NODE_REF, sendBarrier, compositeTransform);
- Mockito.verify(transactionService).sendBarrier(ArgumentMatchers.any());
- Mockito.verify(compositeTransform).apply(pairCpt.capture());
+ verify(sendBarrier).invoke(any());
+ verify(compositeTransform).apply(pairCpt.capture());
final Pair<RpcResult<String>, RpcResult<SendBarrierOutput>> value = pairCpt.getValue();
- Assert.assertTrue(value.getLeft().isSuccessful());
- Assert.assertEquals(data, value.getLeft().getResult());
- Assert.assertTrue(value.getRight().isSuccessful());
- Assert.assertNull(value.getRight().getResult());
-
+ assertTrue(value.getLeft().isSuccessful());
+ assertEquals(data, value.getLeft().getResult());
+ assertTrue(value.getRight().isSuccessful());
+ assertNull(value.getRight().getResult());
}
@Test
public void testCreateSendBarrierInput() {
final SendBarrierInput barrierInput = BarrierUtil.createSendBarrierInput(NODE_REF);
- Assert.assertEquals(NODE_REF, barrierInput.getNode());
- Assert.assertEquals(SendBarrierInput.class, barrierInput.implementedInterface());
+ assertEquals(NODE_REF, barrierInput.getNode());
+ assertEquals(SendBarrierInput.class, barrierInput.implementedInterface());
}
}