5ebee6f2b476f1d759e6f335a04e0d9f8dc91d6e
[bgpcep.git] / pcep / topology-provider / src / test / java / org / opendaylight / controller / config / yang / pcep / topology / provider / PCEPTopologyProviderModuleTest.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.controller.config.yang.pcep.topology.provider;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.junit.Assert.fail;
12 import static org.opendaylight.controller.config.yang.pcep.impl.PCEPDispatcherImplModuleTest.createDispatcherInstance;
13
14 import java.util.Arrays;
15 import java.util.List;
16 import java.util.Random;
17 import javax.management.InstanceAlreadyExistsException;
18 import javax.management.ObjectName;
19 import org.junit.Test;
20 import org.opendaylight.controller.config.api.ValidationException;
21 import org.opendaylight.controller.config.api.jmx.CommitStatus;
22 import org.opendaylight.controller.config.spi.ModuleFactory;
23 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
24 import org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgroupModuleFactory;
25 import org.opendaylight.controller.config.yang.pcep.impl.PCEPDispatcherImplModuleFactory;
26 import org.opendaylight.controller.config.yang.pcep.impl.PCEPDispatcherImplModuleMXBean;
27 import org.opendaylight.controller.config.yang.pcep.impl.PCEPSessionProposalFactoryImplModuleFactory;
28 import org.opendaylight.controller.config.yang.pcep.spi.SimplePCEPExtensionProviderContextModuleFactory;
29 import org.opendaylight.controller.config.yang.pcep.stateful07.cfg.Stateful07PCEPSessionProposalFactoryModuleFactory;
30 import org.opendaylight.controller.config.yang.programming.impl.AbstractInstructionSchedulerTest;
31 import org.opendaylight.controller.config.yang.tcpmd5.jni.cfg.NativeKeyAccessFactoryModuleFactory;
32 import org.opendaylight.controller.config.yang.tcpmd5.netty.cfg.MD5ServerChannelFactoryModuleFactory;
33 import org.opendaylight.controller.config.yang.tcpmd5.netty.cfg.MD5ServerChannelFactoryModuleMXBean;
34 import org.opendaylight.tcpmd5.jni.NativeTestSupport;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
39
40 public class PCEPTopologyProviderModuleTest extends AbstractInstructionSchedulerTest {
41
42     private static final String FACTORY_NAME = PCEPTopologyProviderModuleFactory.NAME;
43     private static final String INSTANCE_NAME = "pcep-topology-provider-instance";
44     private static final String STATEFUL07_TOPOLOGY_INSTANCE_NAME = "pcep-topology-stateful07-instance";
45
46     private static final String LISTEN_ADDRESS = "0.0.0.0";
47     private static final PortNumber LISTEN_PORT = new PortNumber(4189);
48     private static final TopologyId TOPOLOGY_ID = new TopologyId("pcep-topology");
49
50     @Test
51     public void testValidationExceptionListenAddressNotSet() throws Exception {
52         try {
53             createInstance(null, LISTEN_PORT, TOPOLOGY_ID, false);
54             fail();
55         } catch (final ValidationException e) {
56             assertTrue(e.getMessage().contains("ListenAddress is not set"));
57         }
58     }
59
60     @Test
61     public void testValidationExceptionListenPortNotSet() throws Exception {
62         try {
63             createInstance(LISTEN_ADDRESS, null, TOPOLOGY_ID, false);
64             fail();
65         } catch (final ValidationException e) {
66             assertTrue(e.getMessage().contains("ListenPort is not set"));
67         }
68     }
69
70     @Test
71     public void testValidationExceptionTopologyIdNotSet() throws Exception {
72         try {
73             createInstance(LISTEN_ADDRESS, LISTEN_PORT, null, false);
74             fail();
75         } catch (final ValidationException e) {
76             assertTrue(e.getMessage().contains("TopologyId is not set"));
77         }
78     }
79
80     @Test
81     public void testCreateBean() throws Exception {
82         final CommitStatus status = createInstance(false);
83         assertBeanCount(1, FACTORY_NAME);
84         assertStatus(status, 17, 0, 0);
85     }
86
87     @Test
88     public void testReusingOldInstance() throws Exception {
89         createInstance(false);
90         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
91         assertBeanCount(1, FACTORY_NAME);
92         final CommitStatus status = transaction.commit();
93         assertBeanCount(1, FACTORY_NAME);
94         assertStatus(status, 0, 0, 17);
95     }
96
97     @Test
98     public void testReconfigure() throws Exception {
99         createInstance(false);
100         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
101         assertBeanCount(1, FACTORY_NAME);
102         final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(
103                 transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), PCEPTopologyProviderModuleMXBean.class);
104         mxBean.setTopologyId(new TopologyId("new-pcep-topology"));
105         final CommitStatus status = transaction.commit();
106         assertBeanCount(1, FACTORY_NAME);
107         assertStatus(status, 0, 1, 16);
108     }
109
110     @Test
111     public void testCreateBeanWithMD5() throws Exception {
112         NativeTestSupport.assumeSupportedPlatform();
113         final CommitStatus status = createInstance(true);
114         assertBeanCount(1, FACTORY_NAME);
115         assertStatus(status, 19, 0, 0);
116     }
117
118     @Test
119     public void testMD5ValidationFailure() throws Exception {
120         NativeTestSupport.assumeSupportedPlatform();
121         createInstance(true);
122         // remove dispatcher's Md5ServerChannelFactory
123         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
124         assertBeanCount(1, FACTORY_NAME);
125         final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(
126                 transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), PCEPTopologyProviderModuleMXBean.class);
127         final ObjectName dispatcherON = mxBean.getDispatcher();
128         final PCEPDispatcherImplModuleMXBean dispatcher = transaction.newMXBeanProxy(dispatcherON, PCEPDispatcherImplModuleMXBean.class);
129         dispatcher.setMd5ServerChannelFactory(null);
130         try {
131             transaction.validateConfig();
132             fail();
133         }catch(final ValidationException e){
134             assertTrue(e.getMessage(), e.getMessage().contains("Client password is not compatible with selected dispatcher"));
135         }
136     }
137
138     private CommitStatus createInstance(final String listenAddress, final PortNumber listenPort,
139                                         final TopologyId topologyId, boolean addMD5)
140             throws Exception {
141         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
142         createPCEPTopologyProviderModuleInstance(transaction, listenAddress, listenPort, topologyId, addMD5);
143         return transaction.commit();
144     }
145
146     private CommitStatus createInstance(final boolean addMD5) throws Exception {
147         return createInstance(LISTEN_ADDRESS, getRandomPortNumber(), TOPOLOGY_ID, addMD5);
148     }
149
150     public static ObjectName createPCEPTopologyProviderModuleInstance(final ConfigTransactionJMXClient transaction,
151             final ObjectName dataBrokerON, final ObjectName bindingBrokerON, final ObjectName schedulerON) throws Exception {
152         final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
153         final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, PCEPTopologyProviderModuleMXBean.class);
154         mxBean.setDataProvider(dataBrokerON);
155         mxBean.setDispatcher(createDispatcherInstance(transaction, 5));
156
157         mxBean.setListenAddress(new IpAddress(LISTEN_ADDRESS.toCharArray()));
158         mxBean.setListenPort(getRandomPortNumber());
159         mxBean.setRpcRegistry(bindingBrokerON);
160         mxBean.setScheduler(schedulerON);
161         mxBean.setStatefulPlugin(transaction.createModule(Stateful07TopologySessionListenerModuleFactory.NAME,
162                 STATEFUL07_TOPOLOGY_INSTANCE_NAME));
163         mxBean.setTopologyId(TOPOLOGY_ID);
164         return objectName;
165     }
166
167     private static void addMd5(final ConfigTransactionJMXClient transaction, final PCEPTopologyProviderModuleMXBean mxBean) throws InstanceAlreadyExistsException {
168         final ObjectName jniON = transaction.createModule(NativeKeyAccessFactoryModuleFactory.NAME, NativeKeyAccessFactoryModuleFactory.NAME);
169         final ObjectName md5ServerChannelFactoryON = transaction.createModule(MD5ServerChannelFactoryModuleFactory.NAME, MD5ServerChannelFactoryModuleFactory.NAME);
170         final MD5ServerChannelFactoryModuleMXBean md5Factory = transaction.newMXBeanProxy(md5ServerChannelFactoryON, MD5ServerChannelFactoryModuleMXBean.class);
171         md5Factory.setServerKeyAccessFactory(jniON);
172
173
174         final ObjectName dispatcherON = mxBean.getDispatcher();
175         final PCEPDispatcherImplModuleMXBean dispatcher = transaction.newMXBeanProxy(dispatcherON, PCEPDispatcherImplModuleMXBean.class);
176         dispatcher.setMd5ServerChannelFactory(md5ServerChannelFactoryON);
177     }
178
179     private ObjectName createPCEPTopologyProviderModuleInstance(final ConfigTransactionJMXClient transaction, final String listenAddress,
180             final PortNumber listenPort, final TopologyId topologyId, final boolean addMD5) throws Exception {
181         final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
182         final ObjectName notificationBrokerON = createNotificationBrokerInstance(transaction);
183         final ObjectName asyncDataBrokerON = createAsyncDataBrokerInstance(transaction);
184         final ObjectName bindingBrokerON = createBindingBrokerImpl(transaction, createCompatibleDataBrokerInstance(transaction), notificationBrokerON);
185
186         final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, PCEPTopologyProviderModuleMXBean.class);
187         mxBean.setDataProvider(asyncDataBrokerON);
188         mxBean.setDispatcher(createDispatcherInstance(transaction, 5));
189
190         if (addMD5) {
191             addMd5(transaction, mxBean);
192             // create 1 client
193             final Client client = new Client();
194             client.setPassword(Rfc2385Key.getDefaultInstance("foo"));
195             client.setAddress(new IpAddress("127.0.0.1".toCharArray()));
196             mxBean.setClient(Arrays.asList(client));
197         }
198
199         mxBean.setListenAddress(listenAddress == null ? null : new IpAddress(listenAddress.toCharArray()));
200         mxBean.setListenPort(listenPort);
201         mxBean.setRpcRegistry(bindingBrokerON);
202         mxBean.setScheduler(createInstructionSchedulerModuleInstance(transaction, asyncDataBrokerON, bindingBrokerON,
203                 notificationBrokerON));
204         mxBean.setStatefulPlugin(transaction.createModule(Stateful07TopologySessionListenerModuleFactory.NAME,
205                 STATEFUL07_TOPOLOGY_INSTANCE_NAME));
206         mxBean.setTopologyId(topologyId);
207         return objectName;
208     }
209
210     @Override
211     public List<ModuleFactory> getModuleFactories() {
212         final List<ModuleFactory> moduleFactories = super.getModuleFactories();
213         moduleFactories.add(new PCEPTopologyProviderModuleFactory());
214         moduleFactories.add(new PCEPDispatcherImplModuleFactory());
215         moduleFactories.add(new PCEPSessionProposalFactoryImplModuleFactory());
216         moduleFactories.add(new NettyThreadgroupModuleFactory());
217         moduleFactories.add(new SimplePCEPExtensionProviderContextModuleFactory());
218         moduleFactories.add(new Stateful07TopologySessionListenerModuleFactory());
219         moduleFactories.add(new Stateful07PCEPSessionProposalFactoryModuleFactory());
220         moduleFactories.add(new NativeKeyAccessFactoryModuleFactory());
221         moduleFactories.add(new MD5ServerChannelFactoryModuleFactory());
222         return moduleFactories;
223     }
224
225     private static PortNumber getRandomPortNumber() {
226         final Random random = new Random();
227         return new PortNumber(random.nextInt(65000 - 30000 + 1) + 30000);
228     }
229
230     @Override
231     public List<String> getYangModelsPaths() {
232         final List<String> paths = super.getYangModelsPaths();
233         paths.add("/META-INF/yang/network-topology@2013-10-21.yang");
234         paths.add("/META-INF/yang/network-topology-pcep.yang");
235         paths.add("/META-INF/yang/network-topology-pcep-programming.yang");
236         paths.add("/META-INF/yang/network-topology-programming.yang");
237         paths.add("/META-INF/yang/odl-network-topology.yang");
238         paths.add("/META-INF/yang/yang-ext.yang");
239         paths.add("/META-INF/yang/pcep-types.yang");
240         paths.add("/META-INF/yang/rsvp.yang");
241         paths.add("/META-INF/yang/iana.yang");
242         paths.add("/META-INF/yang/network-concepts.yang");
243         paths.add("/META-INF/yang/ieee754.yang");
244         return paths;
245     }
246 }