import static java.util.Objects.requireNonNull;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstructionInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstructionOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstructionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CleanInstructions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CleanInstructionsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CleanInstructionsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CleanInstructionsOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.InstructionsQueueBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.InstructionsQueueKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.Nanotime;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.ProgrammingService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.SubmitInstructionInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.UnknownInstruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.UnknownPreconditionId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.instruction.queue.InstructionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.instruction.status.changed.Details;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.submit.instruction.output.result.failure._case.FailureBuilder;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
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.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-final class ProgrammingServiceImpl implements ClusterSingletonService, InstructionScheduler, ProgrammingService {
- private static final Logger LOG = LoggerFactory.getLogger(ProgrammingServiceImpl.class);
+final class DefaultInstructionScheduler implements ClusterSingletonService, InstructionScheduler {
+ private static final Logger LOG = LoggerFactory.getLogger(DefaultInstructionScheduler.class);
private final Map<InstructionId, InstructionImpl> insns = new HashMap<>();
private final InstanceIdentifier<InstructionsQueue> qid;
private final ClusterSingletonServiceRegistration csspReg;
private final RpcProviderService rpcProviderRegistry;
@GuardedBy("this")
- private ObjectRegistration<ProgrammingService> reg;
+ private Registration reg;
private final class InstructionPusher implements QueueInstruction {
private final InstructionBuilder builder = new InstructionBuilder();
}
}
- ProgrammingServiceImpl(final DataBroker dataProvider, final NotificationPublishService notifs,
+ DefaultInstructionScheduler(final DataBroker dataProvider, final NotificationPublishService notifs,
final Executor executor, final RpcProviderService rpcProviderRegistry,
final ClusterSingletonServiceProvider cssp, final Timer timer, final String instructionId) {
this.dataProvider = requireNonNull(dataProvider);
@Override
public synchronized void instantiateServiceInstance() {
LOG.info("Instruction Queue service {} instantiated", sgi.getName());
- reg = rpcProviderRegistry.registerRpcImplementation(ProgrammingService.class, this);
+ reg = rpcProviderRegistry.registerRpcImplementations(ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+ .put(CancelInstruction.class, this::cancelInstruction)
+ .put(CleanInstructions.class, this::cleanInstructions)
+ .build());
final WriteTransaction wt = dataProvider.newWriteOnlyTransaction();
wt.put(LogicalDatastoreType.OPERATIONAL, qid, new InstructionsQueueBuilder()
return sgi;
}
- @Override
- public ListenableFuture<RpcResult<CancelInstructionOutput>> cancelInstruction(final CancelInstructionInput input) {
+ @VisibleForTesting
+ ListenableFuture<RpcResult<CancelInstructionOutput>> cancelInstruction(final CancelInstructionInput input) {
return Futures.submit(() -> realCancelInstruction(input), executor);
}
- @Override
- public ListenableFuture<RpcResult<CleanInstructionsOutput>> cleanInstructions(final CleanInstructionsInput input) {
+ @VisibleForTesting
+ ListenableFuture<RpcResult<CleanInstructionsOutput>> cleanInstructions(final CleanInstructionsInput input) {
return Futures.submit(() -> realCleanInstructions(input), executor);
}
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.ProgrammingService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
abstract class AbstractProgrammingTest extends AbstractConcurrentDataBrokerTest {
@Mock
@Mock
ClusterSingletonServiceRegistration singletonServiceRegistration;
@Mock
- private ObjectRegistration<ProgrammingService> registration;
+ private Registration registration;
ClusterSingletonService singletonService;
AbstractProgrammingTest() {
return null;
}).when(this.singletonServiceRegistration).close();
- doReturn(this.registration).when(this.rpcRegistry).registerRpcImplementation(any(),
- any(ProgrammingService.class));
+ doReturn(this.registration).when(this.rpcRegistry).registerRpcImplementations(any());
doNothing().when(this.registration).close();
}
import org.opendaylight.yangtools.yang.common.Uint64;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
-public class ProgrammingServiceImplTest extends AbstractProgrammingTest {
-
+public class DefaultInstructionSchedulerTest extends AbstractProgrammingTest {
private static final int INSTRUCTION_DEADLINE_OFFSET_IN_SECONDS = 3;
private static final String INSTRUCTIONS_QUEUE_KEY = "test-instraction-queue";
+
private final Timer timer = new HashedWheelTimer();
private MockedExecutorWrapper mockedExecutorWrapper;
private MockedNotificationServiceWrapper mockedNotificationServiceWrapper;
- private ProgrammingServiceImpl testedProgrammingService;
+ private DefaultInstructionScheduler testedProgrammingService;
@Before
@Override
mockedExecutorWrapper = new MockedExecutorWrapper();
mockedNotificationServiceWrapper = new MockedNotificationServiceWrapper();
- testedProgrammingService = new ProgrammingServiceImpl(getDataBroker(),
+ testedProgrammingService = new DefaultInstructionScheduler(getDataBroker(),
mockedNotificationServiceWrapper.getMockedNotificationService(),
mockedExecutorWrapper.getMockedExecutor(), rpcRegistry, cssp, timer,
INSTRUCTIONS_QUEUE_KEY);