2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.config.yang.bgp.rib.impl;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Matchers.anyInt;
12 import static org.mockito.Matchers.anyString;
13 import static org.mockito.Matchers.contains;
14 import static org.mockito.Mockito.doAnswer;
15 import static org.mockito.Mockito.doNothing;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.mock;
19 import com.google.common.base.Optional;
20 import com.google.common.collect.Lists;
21 import com.google.common.util.concurrent.CheckedFuture;
22 import io.netty.channel.EventLoopGroup;
23 import io.netty.util.concurrent.EventExecutor;
24 import io.netty.util.concurrent.ImmediateEventExecutor;
25 import io.netty.util.concurrent.SucceededFuture;
26 import java.io.InputStream;
27 import java.net.InetSocketAddress;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.Collections;
32 import java.util.List;
33 import java.util.concurrent.atomic.LongAdder;
34 import javax.management.InstanceAlreadyExistsException;
35 import javax.management.InstanceNotFoundException;
36 import javax.management.ObjectName;
37 import org.junit.After;
38 import org.junit.Assert;
39 import org.junit.Before;
40 import org.mockito.Matchers;
41 import org.mockito.Mock;
42 import org.mockito.Mockito;
43 import org.mockito.MockitoAnnotations;
44 import org.opendaylight.controller.config.api.jmx.CommitStatus;
45 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
46 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
47 import org.opendaylight.controller.config.spi.ModuleFactory;
48 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
49 import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
50 import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleMXBean;
51 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingAsyncDataBrokerImplModuleFactory;
52 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingAsyncDataBrokerImplModuleMXBean;
53 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingBrokerImplModuleFactory;
54 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingBrokerImplModuleMXBean;
55 import org.opendaylight.controller.config.yang.md.sal.binding.impl.ForwardedCompatibleDataBrokerImplModuleFactory;
56 import org.opendaylight.controller.config.yang.md.sal.binding.impl.ForwardedCompatibleDataBrokerImplModuleMXBean;
57 import org.opendaylight.controller.config.yang.md.sal.binding.impl.NotificationBrokerImplModuleFactory;
58 import org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModuleFactory;
59 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleFactory;
60 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleMXBean;
61 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomInmemoryDataBrokerModuleFactory;
62 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomInmemoryDataBrokerModuleMXBean;
63 import org.opendaylight.controller.config.yang.md.sal.dom.impl.SchemaServiceImplSingletonModuleFactory;
64 import org.opendaylight.controller.config.yang.netty.eventexecutor.AutoCloseableEventExecutor;
65 import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
66 import org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgroupModuleFactory;
67 import org.opendaylight.controller.config.yang.netty.threadgroup.NioEventLoopGroupCloseable;
68 import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModuleFactory;
69 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
70 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
71 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
72 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodecFactory;
73 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
74 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
75 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
76 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
77 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
78 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
79 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService;
80 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
81 import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService;
82 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
83 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
84 import org.opendaylight.controller.sal.core.api.model.SchemaService;
85 import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider;
86 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
87 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
88 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
89 import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
90 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
91 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
92 import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
93 import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
94 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
95 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
96 import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
97 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
98 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
99 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
100 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
101 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
102 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
103 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
104 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
105 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
112 import org.opendaylight.yangtools.concepts.ListenerRegistration;
113 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
114 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
115 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
116 import org.opendaylight.yangtools.yang.common.RpcResult;
117 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
118 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
119 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
120 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
121 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
122 import org.osgi.framework.Bundle;
123 import org.osgi.framework.BundleListener;
124 import org.osgi.framework.Filter;
125 import org.osgi.framework.ServiceListener;
126 import org.osgi.framework.ServiceReference;
128 public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
130 private static final String INSTANCE_NAME = "rib-impl";
131 private static final String FACTORY_NAME = RIBImplModuleFactory.NAME;
132 private static final String TRANSACTION_NAME = "testTransaction";
134 protected static final RibId RIB_ID = new RibId("test");
135 protected static final BgpId BGP_ID = new BgpId("192.168.1.1");
136 protected static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier("192.168.1.2");
138 private static final AsNumber AS_NUMBER = new AsNumber(5000L);
139 private static final String RIB_EXTENSIONS_INSTANCE_NAME = "rib-extensions-impl";
140 private static final String DOM_BROKER_INSTANCE_NAME = "dom-broker-impl";
141 private static final String BINDING_ASYNC_BROKER_INSTANCE_NAME = "binding-async-broker-instance";
142 private static final String BINDING_BROKER_INSTANCE_NAME = "binding-broker-impl";
143 private static final String COMPATIBLE_DATA_BROKER_INSTANCE_NAME = "binding-data-compatible-broker-instance";
144 private static final String NOTIFICATION_BROKER_INSTANCE_NAME = "notification-broker-impl";
146 private static final InstanceIdentifier<NetworkInstance> OPENCONFIG_IID = InstanceIdentifier.create(NetworkInstances.class).child(NetworkInstance.class,
147 new NetworkInstanceKey("global-bgp"));
150 private ReadWriteTransaction mockedTransaction;
153 private DataBroker mockedDataProvider;
156 private CheckedFuture<Void, TransactionCommitFailedException> mockedFuture;
159 private RpcResult<TransactionStatus> mockedResult;
162 protected BGPDispatcher mockedBGPDispatcher;
165 private RIB mockedRIB;
168 private BgpDeployer bgpDeployer;
171 private BGPTableTypeRegistryConsumer tableTypeREgistry;
174 private BGPPeerRuntimeMXBean mockedPeer;
176 @SuppressWarnings("unchecked")
178 public void setUp() throws Exception {
179 MockitoAnnotations.initMocks(this);
181 final List<ModuleFactory> moduleFactories = getModuleFactories();
182 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, moduleFactories.toArray(new ModuleFactory[moduleFactories.size()])));
184 doAnswer(invocation -> {
185 final String str = invocation.getArgumentAt(0, String.class);
186 final Filter mockFilter = mock(Filter.class);
187 doReturn(str).when(mockFilter).toString();
189 }).when(this.mockedContext).createFilter(anyString());
191 final ServiceReference<?> emptyServiceReference = mock(ServiceReference.class, "Empty");
192 final ServiceReference<?> classLoadingStrategySR = mock(ServiceReference.class, "ClassLoadingStrategy");
193 final ServiceReference<?> dataProviderServiceReference = mock(ServiceReference.class, "Data Provider");
195 Mockito.doNothing().when(this.mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
196 Mockito.doNothing().when(this.mockedContext).removeServiceListener(any(ServiceListener.class));
198 Mockito.doNothing().when(this.mockedContext).addBundleListener(any(BundleListener.class));
199 Mockito.doNothing().when(this.mockedContext).removeBundleListener(any(BundleListener.class));
201 Mockito.doReturn(new Bundle[] {}).when(this.mockedContext).getBundles();
203 Mockito.doReturn(new ServiceReference[] {}).when(this.mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
205 Mockito.doReturn("Empty reference").when(emptyServiceReference).toString();
206 Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString();
207 Mockito.doReturn("Class loading stategy reference").when(classLoadingStrategySR).toString();
209 Mockito.doReturn(emptyServiceReference).when(this.mockedContext).getServiceReference(Mockito.anyString());
210 Mockito.doReturn(dataProviderServiceReference).when(this.mockedContext).getServiceReference(DataBroker.class);
211 Mockito.doReturn(classLoadingStrategySR).when(this.mockedContext).getServiceReference(GeneratedClassLoadingStrategy.class);
212 Mockito.doReturn(classLoadingStrategySR).when(this.mockedContext).getServiceReference(ClassLoadingStrategy.class);
214 Mockito.doReturn(this.mockedDataProvider).when(this.mockedContext).getService(dataProviderServiceReference);
215 Mockito.doReturn(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()).when(this.mockedContext).getService(classLoadingStrategySR);
216 Mockito.doReturn(null).when(this.mockedContext).getService(emptyServiceReference);
218 Mockito.doReturn(this.mockedTransaction).when(this.mockedDataProvider).newReadWriteTransaction();
220 Mockito.doReturn(null).when(this.mockedTransaction).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any());
221 Mockito.doNothing().when(this.mockedTransaction).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(), Mockito.any());
222 Mockito.doNothing().when(this.mockedTransaction).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class));
224 Mockito.doReturn(this.mockedFuture).when(this.mockedTransaction).submit();
225 Mockito.doReturn(TRANSACTION_NAME).when(this.mockedTransaction).getIdentifier();
227 Mockito.doReturn(null).when(this.mockedFuture).get();
228 Mockito.doReturn(null).when(this.mockedFuture).checkedGet();
230 final SchemaContext context = parseYangStreams(getFilesAsStreams(getYangModelsPaths()));
231 final SchemaService mockedSchemaService = mock(SchemaService.class);
232 doReturn(context).when(mockedSchemaService).getGlobalContext();
233 doAnswer(invocation -> {
234 invocation.getArgumentAt(0, SchemaContextListener.class).onGlobalContextUpdated(context);
235 final ListenerRegistration<SchemaContextListener> reg = mock(ListenerRegistration.class);
236 doNothing().when(reg).close();
238 }).when(mockedSchemaService).registerSchemaContextListener(any(SchemaContextListener.class));
240 setupMockService(SchemaService.class, mockedSchemaService);
241 setupMockService(YangTextSourceProvider.class, mock(YangTextSourceProvider.class));
243 final BindingToNormalizedNodeCodec bindingCodec = BindingToNormalizedNodeCodecFactory.newInstance(
244 GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
245 BindingToNormalizedNodeCodecFactory.registerInstance(bindingCodec, mockedSchemaService);
246 setupMockService(BindingToNormalizedNodeCodec.class, bindingCodec);
248 final BGPExtensionProviderContext mockContext = mock(BGPExtensionProviderContext.class);
249 doReturn(mock(MessageRegistry.class)).when(mockContext).getMessageRegistry();
250 setupMockService(BGPExtensionProviderContext.class, mockContext);
252 setupMockService(EventLoopGroup.class, NioEventLoopGroupCloseable.newInstance(0));
253 setupMockService(EventExecutor.class, AutoCloseableEventExecutor.CloseableEventExecutorMixin.globalEventExecutor());
255 setupMockService(DOMNotificationService.class, mock(DOMNotificationService.class));
256 setupMockService(DOMNotificationPublishService.class, mock(DOMNotificationPublishService.class));
257 setupMockService(DOMRpcService.class, mock(DOMRpcService.class));
258 setupMockService(DOMRpcProviderService.class, mock(DOMRpcProviderService.class));
259 setupMockService(DOMMountPointService.class, mock(DOMMountPointService.class));
261 setupMockService(BGPDispatcher.class, this.mockedBGPDispatcher);
262 doReturn(new SucceededFuture<>(ImmediateEventExecutor.INSTANCE, null)).when(this.mockedBGPDispatcher).createReconnectingClient(
263 any(InetSocketAddress.class), any(BGPPeerRegistry.class), anyInt(), any(Optional.class));
265 setupMockService(BgpDeployer.class, this.bgpDeployer);
266 final Global global = mock(Global.class);
267 final Bgp globalBgp = mock(Bgp.class);
268 doReturn(global).when(globalBgp).getGlobal();
269 doReturn("global").when(global).toString();
270 doNothing().when(this.bgpDeployer).onGlobalModified(any(),any(),any());
271 doNothing().when(this.bgpDeployer).onNeighborModified(any(),any(),any());
272 doReturn(this.mockedFuture).when(this.bgpDeployer).writeConfiguration(any(), any());
273 doReturn(this.mockedFuture).when(this.bgpDeployer).removeConfiguration(any());
274 doReturn(java.util.Optional.of(IPV4UNICAST.class)).when(this.tableTypeREgistry).getAfiSafiType(any());
275 doReturn(this.tableTypeREgistry).when(this.bgpDeployer).getTableTypeRegistry();
276 doReturn(OPENCONFIG_IID).when(this.bgpDeployer).getInstanceIdentifier();
277 final DOMTransactionChain mockedChain = mock(DOMTransactionChain.class);
278 final DOMDataWriteTransaction mockedWTx = mock(DOMDataWriteTransaction.class);
279 doNothing().when(mockedWTx).put(any(), any(), any());
280 doNothing().when(mockedWTx).delete(any(), any());
281 doReturn(this.mockedFuture).when(mockedWTx).submit();
282 doReturn(mockedWTx).when(mockedChain).newWriteOnlyTransaction();
283 doReturn(mockedChain).when(this.mockedRIB).createPeerChain(any());
284 doNothing().when(mockedChain).close();
285 doReturn(YangInstanceIdentifier.of(BgpRib.QNAME)).when(this.mockedRIB).getYangRibId();
286 doReturn(new AsNumber(123456l)).when(this.mockedRIB).getLocalAs();
287 doReturn(BGP_ID).when(this.mockedRIB).getBgpIdentifier();
288 final BGPRenderStats mockedRenderStats = mock(BGPRenderStats.class);
289 doReturn(new LongAdder()).when(mockedRenderStats).getConfiguredPeerCounter();
290 doReturn(mockedRenderStats).when(this.mockedRIB).getRenderStats();
291 final DOMDataTreeChangeService mockedTreeChangeService = mock(DOMDataTreeChangeService.class);
292 final ListenerRegistration<?> mockedListenerReg = mock(ListenerRegistration.class);
293 doNothing().when(mockedListenerReg).close();
294 doReturn(mockedListenerReg).when(mockedTreeChangeService).registerDataTreeChangeListener(any(), any());
295 doReturn(mockedTreeChangeService).when(this.mockedRIB).getService();
296 final ImportPolicyPeerTracker mockedImportPolicy = mock(ImportPolicyPeerTracker.class);
297 doNothing().when(mockedImportPolicy).peerRoleChanged(any(), any());
298 doReturn(null).when(mockedImportPolicy).policyFor(any());
299 doReturn(mockedImportPolicy).when(this.mockedRIB).getImportPolicyPeerTracker();
300 doReturn(mock(RIBSupportContextRegistry.class)).when(this.mockedRIB).getRibSupportContext();
301 doReturn(Collections.emptySet()).when(this.mockedRIB).getLocalTablesKeys();
302 doReturn(Collections.emptySet()).when(this.mockedRIB).getLocalTables();
303 doReturn(this.mockedBGPDispatcher).when(this.mockedRIB).getDispatcher();
304 doReturn(InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(RIB_ID))).when(this.mockedRIB).getInstanceIdentifier();
306 setupMockService(RIB.class, this.mockedRIB);
308 setupMockService(RIBExtensionProviderContext.class, new SimpleRIBExtensionProviderContext());
310 setupMockService(BGPPeerRegistry.class, StrictBGPPeerRegistry.GLOBAL);
312 setupMockService(BGPPeerRuntimeMXBean.class, this.mockedPeer);
315 protected void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
316 final ServiceReference<?> mockServiceRef = mock(ServiceReference.class);
317 doReturn(new ServiceReference[]{mockServiceRef}).when(this.mockedContext).
318 getServiceReferences(anyString(), contains(serviceInterface.getName()));
319 doReturn(new ServiceReference[]{mockServiceRef}).when(this.mockedContext).
320 getServiceReferences(serviceInterface.getName(), null);
321 doReturn(instance).when(this.mockedContext).getService(mockServiceRef);
322 doReturn("test").when(mockServiceRef).toString();
325 private static SchemaContext parseYangStreams(final List<InputStream> streams) {
327 return YangParserTestUtils.parseYangStreams(streams);
328 } catch (final ReactorException e) {
329 throw new RuntimeException("Unable to build schema context from " + streams, e);
333 protected List<ModuleFactory> getModuleFactories() {
334 return Lists.newArrayList(new RIBImplModuleFactory(), new GlobalEventExecutorModuleFactory(),
335 new BGPDispatcherImplModuleFactory(), new NettyThreadgroupModuleFactory(),
336 new RIBExtensionsImplModuleFactory(), new DomBrokerImplModuleFactory(), new RuntimeMappingModuleFactory(),
337 new HashedWheelTimerModuleFactory(), new BindingAsyncDataBrokerImplModuleFactory(),
338 new DomInmemoryDataBrokerModuleFactory(), new SchemaServiceImplSingletonModuleFactory(),
339 new NotificationBrokerImplModuleFactory(), new ForwardedCompatibleDataBrokerImplModuleFactory(),
340 new BindingBrokerImplModuleFactory());
344 protected BundleContextServiceRegistrationHandler getBundleContextServiceRegistrationHandler(final Class<?> serviceType) {
345 if (serviceType.equals(SchemaContextListener.class)) {
346 return (clazz, serviceInstance, props) -> {
347 final SchemaContextListener listener = (SchemaContextListener) serviceInstance;
348 final SchemaContext context = parseYangStreams(getFilesAsStreams(getYangModelsPaths()));
349 listener.onGlobalContextUpdated(context);
353 return super.getBundleContextServiceRegistrationHandler(serviceType);
357 public void closeAllModules() throws Exception {
358 super.destroyAllConfigBeans();
362 protected CommitStatus createInstance() throws Exception {
363 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
364 createRIBImplModuleInstance(transaction);
365 return transaction.commit();
368 protected CommitStatus createRIBImplModuleInstance(final RibId ribId, final AsNumber localAs, final BgpId bgpId, final ClusterIdentifier clusterId) throws Exception {
369 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
370 createRIBImplModuleInstance(transaction, ribId, localAs, bgpId, clusterId, createAsyncDataBrokerInstance(transaction));
371 return transaction.commit();
374 private ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final RibId ribId, final AsNumber localAs,
375 final BgpId bgpId, final ClusterIdentifier clusterId, final ObjectName dataBroker) throws Exception {
376 final ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
377 final RIBImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, RIBImplModuleMXBean.class);
378 mxBean.setDataProvider(dataBroker);
379 mxBean.setDomDataProvider(lookupDomAsyncDataBroker(transaction));
380 mxBean.setCodecTreeFactory(lookupMappingServiceInstance(transaction));
381 mxBean.setBgpDispatcher(createBGPDispatcherImplInstance(transaction));
382 mxBean.setExtensions(createRibExtensionsInstance(transaction));
383 mxBean.setRibId(ribId);
384 mxBean.setLocalAs(localAs);
385 mxBean.setBgpRibId(bgpId);
386 mxBean.setClusterId(clusterId);
390 public static ObjectName createBGPDispatcherImplInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
391 final ObjectName nameCreated = transaction.createModule(BGPDispatcherImplModuleFactory.NAME, "bgp-message-fct");
392 final BGPDispatcherImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPDispatcherImplModuleMXBean.class);
396 protected ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction) throws Exception {
397 return createRIBImplModuleInstance(transaction, RIB_ID, AS_NUMBER, BGP_ID, CLUSTER_ID,
398 createAsyncDataBrokerInstance(transaction));
401 public ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final ObjectName dataBroker)
403 return createRIBImplModuleInstance(transaction, RIB_ID, AS_NUMBER, BGP_ID, CLUSTER_ID, dataBroker);
406 public ObjectName createAsyncDataBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException, InstanceNotFoundException {
407 final ObjectName nameCreated = transaction.createModule(BindingAsyncDataBrokerImplModuleFactory.NAME, BINDING_ASYNC_BROKER_INSTANCE_NAME);
408 final BindingAsyncDataBrokerImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BindingAsyncDataBrokerImplModuleMXBean.class);
409 mxBean.setBindingMappingService(lookupMappingServiceInstance(transaction));
410 mxBean.setDomAsyncBroker(lookupDomAsyncDataBroker(transaction));
411 mxBean.setSchemaService(lookupSchemaServiceInstance(transaction));
415 public static ObjectName lookupDomAsyncDataBroker(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
417 return transaction.lookupConfigBean(DomInmemoryDataBrokerModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME);
418 } catch (final InstanceNotFoundException e) {
420 final ObjectName nameCreated = transaction.createModule(DomInmemoryDataBrokerModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME);
421 final DomInmemoryDataBrokerModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, DomInmemoryDataBrokerModuleMXBean.class);
422 mxBean.setSchemaService(lookupSchemaServiceInstance(transaction));
424 } catch (final InstanceAlreadyExistsException e1) {
425 throw new IllegalStateException(e1);
430 private static ObjectName lookupMappingServiceInstance(final ConfigTransactionJMXClient transaction) {
432 return transaction.lookupConfigBean(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
433 } catch (final InstanceNotFoundException e) {
435 return transaction.createModule(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
436 } catch (final InstanceAlreadyExistsException e1) {
437 throw new IllegalStateException(e1);
442 private static ObjectName lookupSchemaServiceInstance(final ConfigTransactionJMXClient transaction) {
444 return transaction.lookupConfigBean(SchemaServiceImplSingletonModuleFactory.NAME, SchemaServiceImplSingletonModuleFactory.SINGLETON_NAME);
445 } catch (final InstanceNotFoundException e) {
447 return transaction.createModule(SchemaServiceImplSingletonModuleFactory.NAME, SchemaServiceImplSingletonModuleFactory.SINGLETON_NAME);
448 } catch (final InstanceAlreadyExistsException e1) {
449 throw new IllegalStateException(e1);
454 private static ObjectName createRibExtensionsInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
455 final ObjectName nameCreated = transaction.createModule(RIBExtensionsImplModuleFactory.NAME, RIB_EXTENSIONS_INSTANCE_NAME);
456 transaction.newMXBeanProxy(nameCreated, RIBExtensionsImplModuleMXBean.class);
460 public List<String> getYangModelsPaths() {
461 final List<String> paths = Lists.newArrayList("/META-INF/yang/bgp-rib.yang", "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
462 "/META-INF/yang/bgp-message.yang", "/META-INF/yang/bgp-multiprotocol.yang", "/META-INF/yang/bgp-types.yang",
463 "/META-INF/yang/network-concepts.yang", "/META-INF/yang/ieee754.yang", "/META-INF/yang/yang-ext.yang");
467 // TODO move back to AbstractConfigTest
468 private static List<InputStream> getFilesAsStreams(final List<String> paths) {
469 final List<InputStream> resources = new ArrayList<>();
470 final List<String> failedToFind = new ArrayList<>();
471 for (final String path : paths) {
472 final InputStream is = AbstractRIBImplModuleTest.class.getResourceAsStream(path);
474 failedToFind.add(path);
479 Assert.assertEquals("Some files were not found", Collections.<String> emptyList(), failedToFind);
484 public ObjectName createBindingBrokerImpl(final ConfigTransactionJMXClient transaction, final ObjectName dataBrokerON,
485 final ObjectName notificationBrokerON) throws Exception {
486 final ObjectName objectName = transaction.createModule(BindingBrokerImplModuleFactory.NAME, BINDING_BROKER_INSTANCE_NAME);
487 final BindingBrokerImplModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, BindingBrokerImplModuleMXBean.class);
488 mxBean.setDataBroker(dataBrokerON);
489 mxBean.setNotificationService(notificationBrokerON);
490 mxBean.setBindingMappingService(lookupMappingServiceInstance(transaction));
491 mxBean.setDomAsyncBroker(lookupDomBrokerInstance(transaction));
495 public static ObjectName lookupDomBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
497 return transaction.lookupConfigBean(DomBrokerImplModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME);
498 } catch (final InstanceNotFoundException e) {
500 final ObjectName nameCreated = transaction.createModule(DomBrokerImplModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME);
501 final DomBrokerImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, DomBrokerImplModuleMXBean.class);
502 mxBean.setAsyncDataBroker(lookupDomAsyncDataBroker(transaction));
504 } catch (final InstanceAlreadyExistsException e1) {
505 throw new IllegalStateException(e1);
510 public ObjectName createCompatibleDataBrokerInstance(final ConfigTransactionJMXClient transaction)
511 throws InstanceAlreadyExistsException, InstanceNotFoundException {
512 final ObjectName nameCreated = transaction.createModule(ForwardedCompatibleDataBrokerImplModuleFactory.NAME, COMPATIBLE_DATA_BROKER_INSTANCE_NAME);
513 final ForwardedCompatibleDataBrokerImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, ForwardedCompatibleDataBrokerImplModuleMXBean.class);
514 mxBean.setDataBroker(lookupDataBrokerInstance(transaction));
518 private static ObjectName lookupDataBrokerInstance(final ConfigTransactionJMXClient transaction) {
520 return transaction.lookupConfigBean(BindingAsyncDataBrokerImplModuleFactory.NAME, BINDING_ASYNC_BROKER_INSTANCE_NAME);
521 } catch (final InstanceNotFoundException e) {
523 return transaction.createModule(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
524 } catch (final InstanceAlreadyExistsException e1) {
525 throw new IllegalStateException(e1);
530 public ObjectName createNotificationBrokerInstance(final ConfigTransactionJMXClient transaction) throws Exception {
531 final ObjectName objectName = transaction.createModule(NotificationBrokerImplModuleFactory.NAME, NOTIFICATION_BROKER_INSTANCE_NAME);