BUG 7797 - Implement agent RPCs for routed RPC testing
[controller.git] / opendaylight / md-sal / samples / clustering-test-app / provider / src / main / java / org / opendaylight / controller / clustering / it / provider / MdsalLowLevelTestProvider.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.clustering.it.provider;
10
11 import com.google.common.util.concurrent.Futures;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.concurrent.Future;
15 import org.opendaylight.controller.clustering.it.provider.impl.GetConstantService;
16 import org.opendaylight.controller.clustering.it.provider.impl.RoutedGetConstantService;
17 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
18 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodecFactory;
19 import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationRegistration;
20 import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService;
21 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
22 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
23 import org.opendaylight.controller.sal.core.api.model.SchemaService;
24 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
25 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
26 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.AddShardReplicaInput;
27 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomeModuleLeaderInput;
28 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderInput;
29 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.IsClientAbortedOutput;
30 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.OdlMdsalLowlevelControlService;
31 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ProduceTransactionsInput;
32 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.PublishNotificationsInput;
33 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterBoundConstantInput;
34 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterConstantInput;
35 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterDefaultConstantInput;
36 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterSingletonConstantInput;
37 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemoveShardReplicaInput;
38 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.SubscribeYnlInput;
39 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnregisterBoundConstantInput;
40 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnregisterFlappingSingletonOutput;
41 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeDdtlOutput;
42 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeDtclOutput;
43 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeYnlInput;
44 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.UnsubscribeYnlOutput;
45 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.WriteTransactionsInput;
46 import org.opendaylight.yangtools.concepts.ListenerRegistration;
47 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
49 import org.opendaylight.yangtools.yang.common.RpcError;
50 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
51 import org.opendaylight.yangtools.yang.common.RpcResult;
52 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
53 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService {
58
59     private static final Logger LOG = LoggerFactory.getLogger(MdsalLowLevelTestProvider.class);
60
61     private final RpcProviderRegistry rpcRegistry;
62     private final BindingAwareBroker.RpcRegistration<OdlMdsalLowlevelControlService> registration;
63     private final BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer;
64     private final SchemaService schemaService;
65     private final ClusterSingletonServiceProvider singletonService;
66     private final DOMRpcProviderService domRpcService;
67
68     private Map<InstanceIdentifier<?>, DOMRpcImplementationRegistration<RoutedGetConstantService>> routedRegistrations =
69             new HashMap<>();
70
71     private DOMRpcImplementationRegistration<GetConstantService> globalGetConstantRegistration = null;
72
73     public MdsalLowLevelTestProvider(final RpcProviderRegistry rpcRegistry,
74                                      final DOMRpcProviderService domRpcService,
75                                      final ClusterSingletonServiceProvider singletonService,
76                                      final SchemaService schemaService,
77                                      final BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer) {
78         this.rpcRegistry = rpcRegistry;
79         this.domRpcService = domRpcService;
80         this.singletonService = singletonService;
81         this.schemaService = schemaService;
82         this.bindingNormalizedNodeSerializer = bindingNormalizedNodeSerializer;
83
84         registration = rpcRegistry.addRpcImplementation(OdlMdsalLowlevelControlService.class, this);
85     }
86
87     @Override
88     public Future<RpcResult<Void>> unregisterSingletonConstant() {
89         return null;
90     }
91
92     @Override
93     public Future<RpcResult<Void>> publishNotifications(PublishNotificationsInput input) {
94         return null;
95     }
96
97     @Override
98     public Future<RpcResult<Void>> subscribeDtcl() {
99         return null;
100     }
101
102     @Override
103     public Future<RpcResult<Void>> writeTransactions(WriteTransactionsInput input) {
104         return null;
105     }
106
107     @Override
108     public Future<RpcResult<IsClientAbortedOutput>> isClientAborted() {
109         return null;
110     }
111
112     @Override
113     public Future<RpcResult<Void>> becomeModuleLeader(BecomeModuleLeaderInput input) {
114         return null;
115     }
116
117     @Override
118     public Future<RpcResult<Void>> removeShardReplica(RemoveShardReplicaInput input) {
119         return null;
120     }
121
122     @Override
123     public Future<RpcResult<Void>> subscribeYnl(SubscribeYnlInput input) {
124         return null;
125     }
126
127     @Override
128     public Future<RpcResult<Void>> becomePrefixLeader(BecomePrefixLeaderInput input) {
129         return null;
130     }
131
132     @Override
133     public Future<RpcResult<Void>> unregisterBoundConstant(final UnregisterBoundConstantInput input) {
134         LOG.debug("unregister-bound-constant, {}", input);
135
136         final DOMRpcImplementationRegistration<RoutedGetConstantService> registration =
137                 routedRegistrations.remove(input.getContext());
138
139         if (registration == null) {
140             LOG.debug("No get-contexted-constant registration for context: {}", input.getContext());
141             final RpcError rpcError = RpcResultBuilder
142                     .newError(ErrorType.APPLICATION, "missing-registration", "No get-constant rpc registration present.");
143             final RpcResult<Void> result = RpcResultBuilder.<Void>failed().withRpcError(rpcError).build();
144             return Futures.immediateFuture(result);
145         }
146
147         registration.close();
148         return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
149     }
150
151     @Override
152     public Future<RpcResult<Void>> registerSingletonConstant(RegisterSingletonConstantInput input) {
153         return null;
154     }
155
156     @Override
157     public Future<RpcResult<Void>> registerDefaultConstant(RegisterDefaultConstantInput input) {
158         return null;
159     }
160
161     @Override
162     public Future<RpcResult<Void>> unregisterConstant() {
163
164         if (globalGetConstantRegistration == null) {
165             final RpcError rpcError = RpcResultBuilder
166                     .newError(ErrorType.APPLICATION, "missing-registration", "No get-constant rpc registration present.");
167             final RpcResult<Void> result = RpcResultBuilder.<Void>failed().withRpcError(rpcError).build();
168             return Futures.immediateFuture(result);
169         }
170
171         globalGetConstantRegistration.close();
172         globalGetConstantRegistration = null;
173
174         return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
175     }
176
177     @Override
178     public Future<RpcResult<UnregisterFlappingSingletonOutput>> unregisterFlappingSingleton() {
179         return null;
180     }
181
182     @Override
183     public Future<RpcResult<Void>> addShardReplica(AddShardReplicaInput input) {
184         return null;
185     }
186
187     @Override
188     public Future<RpcResult<Void>> subscribeDdtl() {
189         return null;
190     }
191
192     @Override
193     public Future<RpcResult<Void>> registerBoundConstant(final RegisterBoundConstantInput input) {
194         LOG.debug("register-bound-constant: {}", input);
195
196         if (input.getContext() == null) {
197             final RpcError error = RpcResultBuilder.newError(
198                     ErrorType.RPC, "Invalid input.", "Context value is null");
199             return Futures.immediateFuture(RpcResultBuilder.<Void>failed().withRpcError(error).build());
200         }
201
202         if (input.getConstant() == null) {
203             final RpcError error = RpcResultBuilder.newError(
204                     ErrorType.RPC, "Invalid input.", "Constant value is null");
205             return Futures.immediateFuture(RpcResultBuilder.<Void>failed().withRpcError(error).build());
206         }
207
208         if (routedRegistrations.containsKey(input.getContext())) {
209             final RpcError error = RpcResultBuilder.newError(ErrorType.RPC, "Registration present.",
210                     "There is already a rpc registered for context: " + input.getContext());
211             return Futures.immediateFuture(RpcResultBuilder.<Void>failed().withRpcError(error).build());
212         }
213
214         final DOMRpcImplementationRegistration<RoutedGetConstantService> registration =
215                 RoutedGetConstantService.registerNew(bindingNormalizedNodeSerializer, domRpcService,
216                         input.getConstant(), input.getContext());
217
218         routedRegistrations.put(input.getContext(), registration);
219         return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
220     }
221
222     @Override
223     public Future<RpcResult<Void>> registerFlappingSingleton() {
224         return null;
225     }
226
227     @Override
228     public Future<RpcResult<UnsubscribeDtclOutput>> unsubscribeDtcl() {
229         return null;
230     }
231
232     @Override
233     public Future<RpcResult<Void>> deconfigureIdIntsShard() {
234         return null;
235     }
236
237     @Override
238     public Future<RpcResult<UnsubscribeYnlOutput>> unsubscribeYnl(UnsubscribeYnlInput input) {
239         return null;
240     }
241
242     @Override
243     public Future<RpcResult<Void>> produceTransactions(ProduceTransactionsInput input) {
244         return null;
245     }
246
247     @Override
248     public Future<RpcResult<Void>> registerConstant(final RegisterConstantInput input) {
249
250         LOG.debug("Received register-constant rpc, input: {}", input);
251
252         if (input.getConstant() == null) {
253             final RpcError error = RpcResultBuilder.newError(
254                     ErrorType.RPC, "Invalid input.", "Constant value is null");
255             return Futures.immediateFuture(RpcResultBuilder.<Void>failed().withRpcError(error).build());
256         }
257
258         if (globalGetConstantRegistration != null) {
259             final RpcError error = RpcResultBuilder.newError(ErrorType.RPC, "Registration present.",
260                     "There is already a get-constant rpc registered.");
261             return Futures.immediateFuture(RpcResultBuilder.<Void>failed().withRpcError(error).build());
262         }
263
264         globalGetConstantRegistration = GetConstantService.registerNew(domRpcService, input.getConstant());
265         return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
266     }
267
268     @Override
269     public Future<RpcResult<Void>> unregisterDefaultConstant() {
270         return null;
271     }
272
273     @Override
274     public Future<RpcResult<UnsubscribeDdtlOutput>> unsubscribeDdtl() {
275         return null;
276     }
277 }