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 io.netty.channel.nio.NioEventLoopGroup;
13 import java.util.Arrays;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.Random;
17 import javax.management.ObjectName;
18 import org.junit.Before;
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.programming.impl.AbstractInstructionSchedulerTest;
28 import org.opendaylight.protocol.pcep.PCEPDispatcher;
29 import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
30 import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory;
31 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
32 import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl;
33 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
34 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.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");
52 public void setUp() throws Exception {
55 SimplePCEPExtensionProviderContext extContext = new SimplePCEPExtensionProviderContext();
56 setupMockService(PCEPExtensionProviderContext.class, extContext);
57 BasePCEPSessionProposalFactory proposalFactory = new BasePCEPSessionProposalFactory(120, 30,
58 Collections.emptyList());
59 setupMockService(PCEPSessionProposalFactory.class, proposalFactory);
60 NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup();
61 setupMockService(PCEPDispatcher.class, new PCEPDispatcherImpl(extContext.getMessageHandlerRegistry(),
62 new DefaultPCEPSessionNegotiatorFactory(proposalFactory, 5), eventLoopGroup, eventLoopGroup));
66 public void testValidationExceptionListenAddressNotSet() throws Exception {
68 createInstance(null, LISTEN_PORT, TOPOLOGY_ID, false);
70 } catch (final ValidationException e) {
71 assertTrue(e.getMessage().contains("ListenAddress is not set"));
76 public void testValidationExceptionListenPortNotSet() throws Exception {
78 createInstance(LISTEN_ADDRESS, null, TOPOLOGY_ID, false);
80 } catch (final ValidationException e) {
81 assertTrue(e.getMessage().contains("ListenPort is not set"));
86 public void testValidationExceptionTopologyIdNotSet() throws Exception {
88 createInstance(LISTEN_ADDRESS, LISTEN_PORT, null, false);
90 } catch (final ValidationException e) {
91 assertTrue(e.getMessage().contains("TopologyId is not set"));
96 public void testCreateBean() throws Exception {
97 final CommitStatus status = createInstance(false);
98 assertBeanCount(1, FACTORY_NAME);
99 assertStatus(status, 13, 0, 0);
103 public void testReusingOldInstance() throws Exception {
104 createInstance(false);
105 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
106 assertBeanCount(1, FACTORY_NAME);
107 final CommitStatus status = transaction.commit();
108 assertBeanCount(1, FACTORY_NAME);
109 assertStatus(status, 0, 0, 13);
113 public void testReconfigure() throws Exception {
114 createInstance(false);
115 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
116 assertBeanCount(1, FACTORY_NAME);
117 final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(
118 transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), PCEPTopologyProviderModuleMXBean.class);
119 mxBean.setTopologyId(new TopologyId("new-pcep-topology"));
120 final CommitStatus status = transaction.commit();
121 assertBeanCount(1, FACTORY_NAME);
122 assertStatus(status, 0, 1, 12);
125 private CommitStatus createInstance(final String listenAddress, final PortNumber listenPort,
126 final TopologyId topologyId, final boolean addMD5)
128 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
129 createPCEPTopologyProviderModuleInstance(transaction, listenAddress, listenPort, topologyId, addMD5);
130 return transaction.commit();
133 private CommitStatus createInstance(final boolean addMD5) throws Exception {
134 return createInstance(LISTEN_ADDRESS, getRandomPortNumber(), TOPOLOGY_ID, addMD5);
137 public static ObjectName createPCEPTopologyProviderModuleInstance(final ConfigTransactionJMXClient transaction,
138 final ObjectName dataBrokerON, final ObjectName bindingBrokerON, final ObjectName schedulerON) throws Exception {
139 final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
140 final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, PCEPTopologyProviderModuleMXBean.class);
141 mxBean.setDataProvider(dataBrokerON);
142 mxBean.setDispatcher(createDispatcherInstance(transaction));
144 mxBean.setListenAddress(new IpAddress(LISTEN_ADDRESS.toCharArray()));
145 mxBean.setListenPort(getRandomPortNumber());
146 mxBean.setRpcRegistry(bindingBrokerON);
147 mxBean.setScheduler(schedulerON);
148 mxBean.setStatefulPlugin(transaction.createModule(Stateful07TopologySessionListenerModuleFactory.NAME,
149 STATEFUL07_TOPOLOGY_INSTANCE_NAME));
150 mxBean.setTopologyId(TOPOLOGY_ID);
154 public static ObjectName createDispatcherInstance(final ConfigTransactionJMXClient transaction)
156 final ObjectName nameCreated = transaction.createModule(PCEPDispatcherImplModuleFactory.NAME, "pcep-dispatcher-impl");
157 transaction.newMXBeanProxy(nameCreated, PCEPDispatcherImplModuleMXBean.class);
161 private ObjectName createPCEPTopologyProviderModuleInstance(final ConfigTransactionJMXClient transaction, final String listenAddress,
162 final PortNumber listenPort, final TopologyId topologyId, final boolean addMD5) throws Exception {
163 final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
164 final ObjectName notificationBrokerON = createNotificationBrokerInstance(transaction);
165 final ObjectName asyncDataBrokerON = createAsyncDataBrokerInstance(transaction);
166 final ObjectName bindingBrokerON = createBindingBrokerImpl(transaction, createCompatibleDataBrokerInstance(transaction), notificationBrokerON);
168 final PCEPTopologyProviderModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, PCEPTopologyProviderModuleMXBean.class);
169 mxBean.setDataProvider(asyncDataBrokerON);
170 mxBean.setDispatcher(createDispatcherInstance(transaction));
174 final Client client = new Client();
175 client.setPassword(Rfc2385Key.getDefaultInstance("foo"));
176 client.setAddress(new IpAddress("127.0.0.1".toCharArray()));
177 mxBean.setClient(Arrays.asList(client));
180 mxBean.setListenAddress(listenAddress == null ? null : new IpAddress(listenAddress.toCharArray()));
181 mxBean.setListenPort(listenPort);
182 mxBean.setRpcRegistry(bindingBrokerON);
183 mxBean.setScheduler(createInstructionSchedulerModuleInstance(transaction, asyncDataBrokerON, bindingBrokerON,
184 notificationBrokerON));
185 mxBean.setStatefulPlugin(transaction.createModule(Stateful07TopologySessionListenerModuleFactory.NAME,
186 STATEFUL07_TOPOLOGY_INSTANCE_NAME));
187 mxBean.setTopologyId(topologyId);
192 public List<ModuleFactory> getModuleFactories() {
193 final List<ModuleFactory> moduleFactories = super.getModuleFactories();
194 moduleFactories.add(new PCEPTopologyProviderModuleFactory());
195 moduleFactories.add(new PCEPDispatcherImplModuleFactory());
196 moduleFactories.add(new NettyThreadgroupModuleFactory());
197 moduleFactories.add(new Stateful07TopologySessionListenerModuleFactory());
198 return moduleFactories;
201 private static PortNumber getRandomPortNumber() {
202 final Random random = new Random();
203 return new PortNumber(random.nextInt(65000 - 30000 + 1) + 30000);
207 public List<String> getYangModelsPaths() {
208 final List<String> paths = super.getYangModelsPaths();
209 paths.add("/META-INF/yang/network-topology@2013-10-21.yang");
210 paths.add("/META-INF/yang/network-topology-pcep.yang");
211 paths.add("/META-INF/yang/network-topology-pcep-programming.yang");
212 paths.add("/META-INF/yang/network-topology-programming.yang");
213 paths.add("/META-INF/yang/odl-network-topology.yang");
214 paths.add("/META-INF/yang/yang-ext.yang");
215 paths.add("/META-INF/yang/pcep-types.yang");
216 paths.add("/META-INF/yang/rsvp.yang");
217 paths.add("/META-INF/yang/iana.yang");
218 paths.add("/META-INF/yang/network-concepts.yang");
219 paths.add("/META-INF/yang/ieee754.yang");