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.pcep.topology.provider;
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;
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;
40 public class PCEPTopologyProviderModuleTest extends AbstractInstructionSchedulerTest {
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";
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");
51 public void testValidationExceptionListenAddressNotSet() throws Exception {
53 createInstance(null, LISTEN_PORT, TOPOLOGY_ID, false);
55 } catch (final ValidationException e) {
56 assertTrue(e.getMessage().contains("ListenAddress is not set"));
61 public void testValidationExceptionListenPortNotSet() throws Exception {
63 createInstance(LISTEN_ADDRESS, null, TOPOLOGY_ID, false);
65 } catch (final ValidationException e) {
66 assertTrue(e.getMessage().contains("ListenPort is not set"));
71 public void testValidationExceptionTopologyIdNotSet() throws Exception {
73 createInstance(LISTEN_ADDRESS, LISTEN_PORT, null, false);
75 } catch (final ValidationException e) {
76 assertTrue(e.getMessage().contains("TopologyId is not set"));
81 public void testCreateBean() throws Exception {
82 final CommitStatus status = createInstance(false);
83 assertBeanCount(1, FACTORY_NAME);
84 assertStatus(status, 17, 0, 0);
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);
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);
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);
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);
131 transaction.validateConfig();
133 }catch(final ValidationException e){
134 assertTrue(e.getMessage(), e.getMessage().contains("Client password is not compatible with selected dispatcher"));
138 private CommitStatus createInstance(final String listenAddress, final PortNumber listenPort,
139 final TopologyId topologyId, boolean addMD5)
141 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
142 createPCEPTopologyProviderModuleInstance(transaction, listenAddress, listenPort, topologyId, addMD5);
143 return transaction.commit();
146 private CommitStatus createInstance(final boolean addMD5) throws Exception {
147 return createInstance(LISTEN_ADDRESS, getRandomPortNumber(), TOPOLOGY_ID, addMD5);
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));
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);
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);
174 final ObjectName dispatcherON = mxBean.getDispatcher();
175 final PCEPDispatcherImplModuleMXBean dispatcher = transaction.newMXBeanProxy(dispatcherON, PCEPDispatcherImplModuleMXBean.class);
176 dispatcher.setMd5ServerChannelFactory(md5ServerChannelFactoryON);
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);
186 final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, PCEPTopologyProviderModuleMXBean.class);
187 mxBean.setDataProvider(asyncDataBrokerON);
188 mxBean.setDispatcher(createDispatcherInstance(transaction, 5));
191 addMd5(transaction, mxBean);
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));
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);
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;
225 private static PortNumber getRandomPortNumber() {
226 final Random random = new Random();
227 return new PortNumber(random.nextInt(65000 - 30000 + 1) + 30000);
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");