X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsamples%2Fclustering-test-app%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustering%2Fit%2Fprovider%2FCarProvider.java;h=3f8bff0992709710bcfac271f4b1d5ef455805e6;hp=ed0aa1e3d2f37bc6810eb05ffef2a06e99f0c336;hb=a35607c5040d0fd561529fde3032c9f49393deeb;hpb=99f994b3e45963f6ef46bc2b71ab4dd8eea8b9ac diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/CarProvider.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/CarProvider.java index ed0aa1e3d2..3f8bff0992 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/CarProvider.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/CarProvider.java @@ -8,26 +8,28 @@ package org.opendaylight.controller.clustering.it.provider; import com.google.common.base.Stopwatch; -import com.google.common.collect.Sets; -import com.google.common.util.concurrent.CheckedFuture; 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 java.util.Collection; -import java.util.concurrent.Future; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeCommitCohortRegistry; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; +import org.opendaylight.mdsal.binding.api.WriteTransaction; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistration; +import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry; +import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.eos.binding.api.Entity; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener; @@ -37,11 +39,30 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.CarService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.Cars; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.CarsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterCommitCohortInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterCommitCohortOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterCommitCohortOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterLoggingDtclInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterLoggingDtclOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterLoggingDtclOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterOwnershipInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterOwnershipOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.RegisterOwnershipOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StopStressTestInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StopStressTestOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StopStressTestOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StressTestInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StressTestOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.StressTestOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterCommitCohortInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterCommitCohortOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterCommitCohortOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterLoggingDtclsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterLoggingDtclsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterLoggingDtclsOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterOwnershipInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterOwnershipOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.UnregisterOwnershipOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.cars.CarEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.sal.clustering.it.car.rev140818.cars.CarEntryBuilder; import org.opendaylight.yangtools.concepts.ListenerRegistration; @@ -49,6 +70,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; 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.data.api.YangInstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +80,7 @@ import org.slf4j.LoggerFactory; * * @author Thomas Pantelis */ +@SuppressFBWarnings("SLF4J_ILLEGAL_PASSED_CLASS") public class CarProvider implements CarService { private static final Logger LOG_PURCHASE_CAR = LoggerFactory.getLogger(PurchaseCarProvider.class); @@ -65,7 +88,7 @@ public class CarProvider implements CarService { private static final String ENTITY_TYPE = "cars"; private static final InstanceIdentifier CARS_IID = InstanceIdentifier.builder(Cars.class).build(); - private static final DataTreeIdentifier CARS_DTID = new DataTreeIdentifier<>( + private static final DataTreeIdentifier CARS_DTID = DataTreeIdentifier.create( LogicalDatastoreType.CONFIGURATION, CARS_IID); private final DataBroker dataProvider; @@ -77,10 +100,9 @@ public class CarProvider implements CarService { private final CarEntityOwnershipListener ownershipListener = new CarEntityOwnershipListener(); private final AtomicBoolean registeredListener = new AtomicBoolean(); - private final Collection> carsDclRegistrations = - Sets.newConcurrentHashSet(); - private final Collection> carsDtclRegistrations = - Sets.newConcurrentHashSet(); + private final Set> carsDclRegistrations = ConcurrentHashMap.newKeySet(); + private final Set> carsDtclRegistrations = + ConcurrentHashMap.newKeySet(); private volatile Thread testThread; private volatile boolean stopThread; @@ -113,21 +135,21 @@ public class CarProvider implements CarService { } @Override - public Future> stressTest(final StressTestInput input) { + public ListenableFuture> stressTest(final StressTestInput input) { final int inputRate; final long inputCount; // If rate is not provided, or given as zero, then just return. - if (input.getRate() == null || input.getRate() == 0) { + if (input.getRate() == null || input.getRate().toJava() == 0) { LOG_PURCHASE_CAR.info("Exiting stress test as no rate is given."); - return Futures.immediateFuture(RpcResultBuilder.failed() + return Futures.immediateFuture(RpcResultBuilder.failed() .withError(ErrorType.PROTOCOL, "invalid rate") .build()); } - inputRate = input.getRate(); + inputRate = input.getRate().toJava(); if (input.getCount() != null) { - inputCount = input.getCount(); + inputCount = input.getCount().toJava(); } else { inputCount = 0; } @@ -140,13 +162,13 @@ public class CarProvider implements CarService { failureCounter.set(0); WriteTransaction tx = dataProvider.newWriteOnlyTransaction(); - InstanceIdentifier carsId = InstanceIdentifier.builder(Cars.class).build(); + InstanceIdentifier carsId = InstanceIdentifier.create(Cars.class); tx.merge(LogicalDatastoreType.CONFIGURATION, carsId, new CarsBuilder().build()); try { - tx.submit().checkedGet(5, TimeUnit.SECONDS); - } catch (TransactionCommitFailedException | TimeoutException e) { + tx.commit().get(5, TimeUnit.SECONDS); + } catch (TimeoutException | InterruptedException | ExecutionException e) { LOG_PURCHASE_CAR.error("Put Cars failed",e); - return Futures.immediateFuture(RpcResultBuilder.success().build()); + return Futures.immediateFuture(RpcResultBuilder.success(new StressTestOutputBuilder().build()).build()); } stopThread = false; @@ -160,13 +182,11 @@ public class CarProvider implements CarService { WriteTransaction tx1 = dataProvider.newWriteOnlyTransaction(); CarEntry car = new CarEntryBuilder().setId(new CarId("car" + id)).build(); tx1.put(LogicalDatastoreType.CONFIGURATION, - InstanceIdentifier.builder(Cars.class).child(CarEntry.class, car.getKey()).build(), - car); - CheckedFuture future = tx1.submit(); - Futures.addCallback(future, new FutureCallback() { + InstanceIdentifier.builder(Cars.class).child(CarEntry.class, car.key()).build(), car); + tx1.commit().addCallback(new FutureCallback() { @Override - public void onSuccess(final Void result) { + public void onSuccess(final CommitInfo result) { // Transaction succeeded succcessCounter.getAndIncrement(); } @@ -185,7 +205,7 @@ public class CarProvider implements CarService { } if (count.get() % 1000 == 0) { - LOG_PURCHASE_CAR.info("Cars created {}, time: {}",count.get(),sw.elapsed(TimeUnit.SECONDS)); + LOG_PURCHASE_CAR.info("Cars created {}, time: {}", count.get(), sw.elapsed(TimeUnit.SECONDS)); } // Check if a count is specified in input and we have created that many cars. @@ -198,16 +218,16 @@ public class CarProvider implements CarService { }); testThread.start(); - return Futures.immediateFuture(RpcResultBuilder.success().build()); + return Futures.immediateFuture(RpcResultBuilder.success(new StressTestOutputBuilder().build()).build()); } @Override - public Future> stopStressTest() { + public ListenableFuture> stopStressTest(final StopStressTestInput input) { stopThread(); StopStressTestOutputBuilder stopStressTestOutput; stopStressTestOutput = new StopStressTestOutputBuilder() - .setSuccessCount(succcessCounter.longValue()) - .setFailureCount(failureCounter.longValue()); + .setSuccessCount(Uint32.valueOf(succcessCounter.longValue())) + .setFailureCount(Uint32.valueOf(failureCounter.longValue())); final StopStressTestOutput result = stopStressTestOutput.build(); LOG_PURCHASE_CAR.info("Executed Stop Stress test; No. of cars created {}; " @@ -220,7 +240,7 @@ public class CarProvider implements CarService { @Override - public Future> registerOwnership(final RegisterOwnershipInput input) { + public ListenableFuture> registerOwnership(final RegisterOwnershipInput input) { if (registeredListener.compareAndSet(false, true)) { ownershipService.registerListener(ENTITY_TYPE, ownershipListener); } @@ -229,16 +249,17 @@ public class CarProvider implements CarService { try { ownershipService.registerCandidate(entity); } catch (CandidateAlreadyRegisteredException e) { - return RpcResultBuilder.failed().withError(ErrorType.APPLICATION, + return RpcResultBuilder.failed().withError(ErrorType.APPLICATION, "Could not register for car " + input.getCarId(), e).buildFuture(); } - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new RegisterOwnershipOutputBuilder().build()).buildFuture(); } @Override - public Future> unregisterOwnership(final UnregisterOwnershipInput input) { - return RpcResultBuilder.success().buildFuture(); + public ListenableFuture> unregisterOwnership( + final UnregisterOwnershipInput input) { + return RpcResultBuilder.success(new UnregisterOwnershipOutputBuilder().build()).buildFuture(); } private static class CarEntityOwnershipListener implements EntityOwnershipListener { @@ -249,17 +270,19 @@ public class CarProvider implements CarService { } @Override - public Future> registerLoggingDtcl() { + public ListenableFuture> registerLoggingDtcl( + final RegisterLoggingDtclInput input) { LOG_CAR_PROVIDER.info("Registering a new CarDataTreeChangeListener"); final ListenerRegistration carsDtclRegistration = dataProvider.registerDataTreeChangeListener(CARS_DTID, new CarDataTreeChangeListener()); carsDtclRegistrations.add(carsDtclRegistration); - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new RegisterLoggingDtclOutputBuilder().build()).buildFuture(); } @Override - public Future> unregisterLoggingDtcls() { + public ListenableFuture> unregisterLoggingDtcls( + final UnregisterLoggingDtclsInput input) { LOG_CAR_PROVIDER.info("Unregistering the CarDataTreeChangeListener(s)"); synchronized (carsDtclRegistrations) { int numListeners = 0; @@ -270,15 +293,16 @@ public class CarProvider implements CarService { carsDtclRegistrations.clear(); LOG_CAR_PROVIDER.info("Unregistered {} CaraDataTreeChangeListener(s)", numListeners); } - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new UnregisterLoggingDtclsOutputBuilder().build()).buildFuture(); } @Override @SuppressWarnings("checkstyle:IllegalCatch") - public Future> unregisterCommitCohort() { + public ListenableFuture> unregisterCommitCohort( + final UnregisterCommitCohortInput input) { closeCommitCohortRegistration(); - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new UnregisterCommitCohortOutputBuilder().build()).buildFuture(); } private void closeCommitCohortRegistration() { @@ -290,17 +314,18 @@ public class CarProvider implements CarService { } @Override - public synchronized Future> registerCommitCohort() { + public synchronized ListenableFuture> registerCommitCohort( + final RegisterCommitCohortInput input) { if (commitCohortReg.get() != null) { - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new RegisterCommitCohortOutputBuilder().build()).buildFuture(); } - final DOMDataTreeCommitCohortRegistry commitCohortRegistry = (DOMDataTreeCommitCohortRegistry) - domDataBroker.getSupportedExtensions().get(DOMDataTreeCommitCohortRegistry.class); + final DOMDataTreeCommitCohortRegistry commitCohortRegistry = domDataBroker.getExtensions().getInstance( + DOMDataTreeCommitCohortRegistry.class); if (commitCohortRegistry == null) { // Shouldn't happen - return RpcResultBuilder.failed().withError(ErrorType.APPLICATION, + return RpcResultBuilder.failed().withError(ErrorType.APPLICATION, "DOMDataTreeCommitCohortRegistry not found").buildFuture(); } @@ -312,13 +337,11 @@ public class CarProvider implements CarService { // to address all list entries, the second path argument is wild-carded by specifying just the CarEntry.QNAME. final YangInstanceIdentifier carEntryPath = YangInstanceIdentifier.builder( YangInstanceIdentifier.of(Cars.QNAME)).node(CarEntry.QNAME).node(CarEntry.QNAME).build(); - commitCohortReg.set(commitCohortRegistry.registerCommitCohort( - new org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier( - org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION, - carEntryPath), new CarEntryDataTreeCommitCohort())); + commitCohortReg.set(commitCohortRegistry.registerCommitCohort(new DOMDataTreeIdentifier( + LogicalDatastoreType.CONFIGURATION, carEntryPath), new CarEntryDataTreeCommitCohort())); LOG_CAR_PROVIDER.info("Registered commit cohort"); - return RpcResultBuilder.success().buildFuture(); + return RpcResultBuilder.success(new RegisterCommitCohortOutputBuilder().build()).buildFuture(); } }