From 271e66acd1391895c006806dfe76ae6d09017a83 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Thu, 16 Feb 2017 15:53:43 +0100 Subject: [PATCH] BUG 7796: Implement agent RPCs for global RPC testing This implements the get-constant and it's lifecycle control rpc's from the lowlevel mdsal test model. Change-Id: I2da89b73d289b8fe6bf95aeaba34e7fb50032f7e Signed-off-by: Tomas Cere --- .../provider/MdsalLowLevelTestProvider.java | 218 ++++++++++++++++++ .../it/provider/impl/GetConstantService.java | 77 +++++++ .../blueprint/cluster-test-app.xml | 7 + 3 files changed, 302 insertions(+) create mode 100644 opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java create mode 100644 opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/GetConstantService.java diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java new file mode 100644 index 0000000000..81f0220b1a --- /dev/null +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2017 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.controller.clustering.it.provider; + +import com.google.common.util.concurrent.Futures; +import java.util.concurrent.Future; +import org.opendaylight.controller.clustering.it.provider.impl.GetConstantService; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationRegistration; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.AddShardReplicaInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomeModuleLeaderInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.IsClientAbortedOutput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.OdlMdsalLowlevelControlService; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ProduceTransactionsInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.PublishNotificationsInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterBoundConstantInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterConstantInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterDefaultConstantInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterSingletonConstantInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemoveShardReplicaInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.SubscribeYnlInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnregisterBoundConstantInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnregisterFlappingSingletonOutput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeDdtlOutput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeDtclOutput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeYnlInput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeYnlOutput; +import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.WriteTransactionsInput; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService { + + private static final Logger LOG = LoggerFactory.getLogger(MdsalLowLevelTestProvider.class); + + private final RpcProviderRegistry rpcRegistry; + private final BindingAwareBroker.RpcRegistration registration; + private final ClusterSingletonServiceProvider singletonService; + private final DOMRpcProviderService domRpcService; + + private DOMRpcImplementationRegistration globalGetConstantRegistration = null; + + public MdsalLowLevelTestProvider(final RpcProviderRegistry rpcRegistry, + final DOMRpcProviderService domRpcService, + final ClusterSingletonServiceProvider singletonService) { + this.rpcRegistry = rpcRegistry; + this.domRpcService = domRpcService; + this.singletonService = singletonService; + + registration = rpcRegistry.addRpcImplementation(OdlMdsalLowlevelControlService.class, this); + } + + @Override + public Future> unregisterSingletonConstant() { + return null; + } + + @Override + public Future> publishNotifications(PublishNotificationsInput input) { + return null; + } + + @Override + public Future> subscribeDtcl() { + return null; + } + + @Override + public Future> writeTransactions(WriteTransactionsInput input) { + return null; + } + + @Override + public Future> isClientAborted() { + return null; + } + + @Override + public Future> becomeModuleLeader(BecomeModuleLeaderInput input) { + return null; + } + + @Override + public Future> removeShardReplica(RemoveShardReplicaInput input) { + return null; + } + + @Override + public Future> subscribeYnl(SubscribeYnlInput input) { + return null; + } + + @Override + public Future> becomePrefixLeader(BecomePrefixLeaderInput input) { + return null; + } + + @Override + public Future> unregisterBoundConstant(UnregisterBoundConstantInput input) { + return null; + } + + @Override + public Future> registerSingletonConstant(RegisterSingletonConstantInput input) { + return null; + } + + @Override + public Future> registerDefaultConstant(RegisterDefaultConstantInput input) { + return null; + } + + @Override + public Future> unregisterConstant() { + + if (globalGetConstantRegistration == null) { + final RpcError rpcError = RpcResultBuilder + .newError(ErrorType.APPLICATION, "missing-registration", "No get-constant rpc registration present."); + final RpcResult result = RpcResultBuilder.failed().withRpcError(rpcError).build(); + return Futures.immediateFuture(result); + } + + globalGetConstantRegistration.close(); + globalGetConstantRegistration = null; + + return Futures.immediateFuture(RpcResultBuilder.success().build()); + } + + @Override + public Future> unregisterFlappingSingleton() { + return null; + } + + @Override + public Future> addShardReplica(AddShardReplicaInput input) { + return null; + } + + @Override + public Future> subscribeDdtl() { + return null; + } + + @Override + public Future> registerBoundConstant(RegisterBoundConstantInput input) { + return null; + } + + @Override + public Future> registerFlappingSingleton() { + return null; + } + + @Override + public Future> unsubscribeDtcl() { + return null; + } + + @Override + public Future> deconfigureIdIntsShard() { + return null; + } + + @Override + public Future> unsubscribeYnl(UnsubscribeYnlInput input) { + return null; + } + + @Override + public Future> produceTransactions(ProduceTransactionsInput input) { + return null; + } + + @Override + public Future> registerConstant(final RegisterConstantInput input) { + + LOG.debug("Received register-constant rpc, input: {}", input); + + if (input.getConstant() == null) { + final RpcError error = RpcResultBuilder.newError( + ErrorType.RPC, "Invalid input.", "Constant value is null"); + return Futures.immediateFuture(RpcResultBuilder.failed().withRpcError(error).build()); + } + + if (globalGetConstantRegistration != null) { + final RpcError error = RpcResultBuilder.newError(ErrorType.RPC, "Registration present.", + "There is already a get-constant rpc registered."); + return Futures.immediateFuture(RpcResultBuilder.failed().withRpcError(error).build()); + } + + globalGetConstantRegistration = GetConstantService.registerNew(domRpcService, input.getConstant()); + return Futures.immediateFuture(RpcResultBuilder.success().build()); + } + + @Override + public Future> unregisterDefaultConstant() { + return null; + } + + @Override + public Future> unsubscribeDdtl() { + return null; + } +} diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/GetConstantService.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/GetConstantService.java new file mode 100644 index 0000000000..6f04b5f2ff --- /dev/null +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/GetConstantService.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2017 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.controller.clustering.it.provider.impl; + +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.Futures; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcIdentifier; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementation; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationRegistration; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; +import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GetConstantService implements DOMRpcImplementation { + + private static final Logger LOG = LoggerFactory.getLogger(GetConstantService.class); + + private static final QName OUTPUT = + QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target","2017-02-15", "output"); + private static final QName CONSTANT = + QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target","2017-02-15", "constant"); + private static final QName GET_CONSTANT = + QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target","2017-02-15", "get-constant"); + + private final String constant; + + private GetConstantService(final String constant) { + this.constant = constant; + } + + public static DOMRpcImplementationRegistration registerNew( + final DOMRpcProviderService rpcProviderService, final String constant) { + + LOG.debug("Registering get-constant service, constant value: {}", constant); + final DOMRpcIdentifier id = DOMRpcIdentifier.create(SchemaPath.create(true, GET_CONSTANT)); + + return rpcProviderService.registerRpcImplementation(new GetConstantService(constant), id); + } + + @Nonnull + @Override + public CheckedFuture invokeRpc(@Nonnull final DOMRpcIdentifier rpc, + @Nullable final NormalizedNode input) { + LOG.debug("get-constant invoked, current value: {}", constant); + + final LeafNode value = ImmutableLeafNodeBuilder.create() + .withNodeIdentifier(new NodeIdentifier(CONSTANT)) + .withValue(constant) + .build(); + + final ContainerNode result = ImmutableContainerNodeBuilder.create() + .withNodeIdentifier(new NodeIdentifier(OUTPUT)) + .withChild(value) + .build(); + + return Futures.immediateCheckedFuture(new DefaultDOMRpcResult(result)); + } +} diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/resources/org/opendaylight/blueprint/cluster-test-app.xml b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/resources/org/opendaylight/blueprint/cluster-test-app.xml index 4a969d5502..687b1a39f5 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/resources/org/opendaylight/blueprint/cluster-test-app.xml +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/resources/org/opendaylight/blueprint/cluster-test-app.xml @@ -8,6 +8,7 @@ + @@ -43,4 +44,10 @@ + + + + + + -- 2.36.6