2880bd925bceadb95a8193e1a9a9db3ef62ac87d
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / controller / config / yang / bgp / rib / impl / BGPPeerModuleTest.java
1 /*
2  * Copyright (c) 2013 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.bgp.rib.impl;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.junit.Assert.fail;
12 import static org.mockito.Mockito.doReturn;
13 import com.google.common.collect.Lists;
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.List;
17 import javax.management.InstanceAlreadyExistsException;
18 import javax.management.ObjectName;
19 import org.junit.Test;
20 import org.opendaylight.controller.config.api.IdentityAttributeRef;
21 import org.opendaylight.controller.config.api.ValidationException;
22 import org.opendaylight.controller.config.api.jmx.CommitStatus;
23 import org.opendaylight.controller.config.spi.ModuleFactory;
24 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
25 import org.opendaylight.controller.config.yang.tcpmd5.jni.cfg.NativeKeyAccessFactoryModuleFactory;
26 import org.opendaylight.controller.config.yang.tcpmd5.netty.cfg.MD5ClientChannelFactoryModuleFactory;
27 import org.opendaylight.controller.config.yang.tcpmd5.netty.cfg.MD5ClientChannelFactoryModuleMXBean;
28 import org.opendaylight.tcpmd5.jni.NativeTestSupport;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
37 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
38
39 public class BGPPeerModuleTest extends AbstractRIBImplModuleTest {
40
41     private static final String INSTANCE_NAME = "bgp-peer-module-impl";
42     private static final String FACTORY_NAME = BGPPeerModuleFactory.NAME;
43
44     private static final IpAddress HOST = new IpAddress(new Ipv4Address("127.0.0.1"));
45     private static final PortNumber portNumber = new PortNumber(1);
46
47     @Override
48     protected BindingRuntimeContext getBindingRuntimeContext() {
49         final BindingRuntimeContext ret = super.getBindingRuntimeContext();
50         doReturn(Ipv4AddressFamily.class).when(ret).getIdentityClass(Ipv4AddressFamily.QNAME);
51         doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(ret).getIdentityClass(MplsLabeledVpnSubsequentAddressFamily.QNAME);
52         return ret;
53     }
54
55     @Override
56     protected List<ModuleFactory> getModuleFactories() {
57         final List<ModuleFactory> moduleFactories = super.getModuleFactories();
58         moduleFactories.add(new BGPPeerModuleFactory());
59         moduleFactories.add(new BGPTableTypeImplModuleFactory());
60         moduleFactories.add(new NativeKeyAccessFactoryModuleFactory());
61         moduleFactories.add(new MD5ClientChannelFactoryModuleFactory());
62         moduleFactories.add(new StrictBgpPeerRegistryModuleFactory());
63         moduleFactories.add(new AddPathImplModuleFactory());
64         return moduleFactories;
65     }
66
67     @Test
68     public void testValidationExceptionPortNotSet() throws Exception {
69         try {
70             createBgpPeerInstance(HOST, null, false);
71             fail();
72         } catch (final ValidationException e) {
73             assertTrue(e.getMessage().contains("Port value is not set."));
74         }
75     }
76
77     @Test
78     public void testValidationExceptionInternalPeerRole() throws Exception {
79         try {
80             createInternalBgpPeerInstance();
81             fail();
82         } catch (final ValidationException e) {
83             assertTrue(e.getMessage().contains("Internal Peer Role is reserved for Application Peer use."));
84         }
85     }
86
87     @Test
88     public void testValidationExceptionHostNotSet() throws Exception {
89         try {
90             createBgpPeerInstance(null, portNumber, false);
91             fail();
92         } catch (final ValidationException e) {
93             assertTrue(e.getMessage().contains("Host value is not set."));
94         }
95     }
96
97     @Test
98     public void testCreateBean() throws Exception {
99         final CommitStatus status = createBgpPeerInstance();
100         assertBeanCount(1, FACTORY_NAME);
101         assertStatus(status, 21, 0, 0);
102     }
103
104     @Test
105     public void testCreateBeanWithMD5() throws Exception {
106         NativeTestSupport.assumeSupportedPlatform();
107         final CommitStatus status = createBgpPeerInstance(true);
108         assertBeanCount(1, FACTORY_NAME);
109         assertStatus(status, 23, 0, 0);
110     }
111
112     @Test
113     public void testMD5ValidationFailure() throws Exception {
114         NativeTestSupport.assumeSupportedPlatform();
115         createBgpPeerInstance(true);
116         // now remove md5 from dispatcher
117         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
118         final ObjectName nameCreated = transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME);
119         final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPPeerModuleMXBean.class);
120         final BGPDispatcherImplModuleMXBean bgpDispatcherImplModuleMXBean = getBgpDispatcherImplModuleMXBean(transaction, mxBean);
121         bgpDispatcherImplModuleMXBean.setMd5ChannelFactory(null);
122         try {
123             transaction.validateConfig();
124             fail();
125         } catch (final ValidationException e) {
126             assertTrue(e.getMessage(), e.getMessage().contains("Underlying dispatcher does not support MD5 clients"));
127         }
128     }
129
130     @Test
131     public void testReusingOldInstance() throws Exception {
132         CommitStatus status = createBgpPeerInstance();
133         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
134         assertBeanCount(1, FACTORY_NAME);
135         status = transaction.commit();
136         assertBeanCount(1, FACTORY_NAME);
137         assertStatus(status, 0, 0, 21);
138     }
139
140     @Test
141     public void testReconfigure() throws Exception {
142         CommitStatus status = createBgpPeerInstance();
143         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
144         assertBeanCount(1, FACTORY_NAME);
145         final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME),
146             BGPPeerModuleMXBean.class);
147         mxBean.setPort(new PortNumber(10));
148         status = transaction.commit();
149         assertBeanCount(1, FACTORY_NAME);
150         assertStatus(status, 0, 1, 20);
151     }
152
153     private ObjectName createBgpPeerInstance(final ConfigTransactionJMXClient transaction, final IpAddress host,
154             final PortNumber port, final boolean md5, final boolean internalPeerRole) throws Exception {
155         final ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
156         final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPPeerModuleMXBean.class);
157
158         mxBean.setPeerRegistry(createPeerRegistry(transaction));
159         mxBean.setHost(host);
160         mxBean.setPort(port);
161         mxBean.setAdvertizedTable(Collections.<ObjectName>emptyList());
162         mxBean.setRouteRefresh(false);
163         {
164             final ObjectName ribON = createRIBImplModuleInstance(transaction);
165             mxBean.setRib(ribON);
166         }
167         mxBean.setAddPath(createAddPathCollection(transaction));
168         if (md5) {
169             final BGPDispatcherImplModuleMXBean bgpDispatcherProxy = getBgpDispatcherImplModuleMXBean(transaction, mxBean);
170             final ObjectName jniON = transaction.createModule(NativeKeyAccessFactoryModuleFactory.NAME, NativeKeyAccessFactoryModuleFactory.NAME);
171             final ObjectName md5ClientON = transaction.createModule(MD5ClientChannelFactoryModuleFactory.NAME,
172                     MD5ClientChannelFactoryModuleFactory.NAME);
173             final MD5ClientChannelFactoryModuleMXBean md5ClientProxy =
174                     transaction.newMXBeanProxy(md5ClientON, MD5ClientChannelFactoryModuleMXBean.class);
175             md5ClientProxy.setKeyAccessFactory(jniON);
176
177             bgpDispatcherProxy.setMd5ChannelFactory(md5ClientON);
178
179             mxBean.setPassword(Rfc2385Key.getDefaultInstance("foo"));
180
181         }
182
183         if(internalPeerRole) {
184             mxBean.setPeerRole(PeerRole.Internal);
185         }
186
187         mxBean.setAdvertizedTable(Lists.newArrayList(BGPTableTypeImplModuleTest.createTableInstance(transaction,
188             new IdentityAttributeRef(Ipv4AddressFamily.QNAME.toString()),
189             new IdentityAttributeRef(MplsLabeledVpnSubsequentAddressFamily.QNAME.toString()))));
190
191         final ObjectName notificationBrokerON = createNotificationBrokerInstance(transaction);
192         final ObjectName bindingBrokerON = createBindingBrokerImpl(transaction, createCompatibleDataBrokerInstance(transaction), notificationBrokerON);
193         mxBean.setRpcRegistry(bindingBrokerON);
194         return nameCreated;
195     }
196
197     private static List<ObjectName> createAddPathCollection(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
198         final ObjectName name1 = transaction.createModule(AddPathImplModuleFactory.NAME, "add-path-inst-1");
199         final AddPathImplModuleMXBean mxBean = transaction.newMXBeanProxy(name1, AddPathImplModuleMXBean.class);
200         mxBean.setAddressFamily(AddPathImplModuleTest.createAddressFamily(transaction, "add-path-inst-1"));
201         mxBean.setSendReceive(SendReceive.Both);
202
203         final ObjectName name2 = transaction.createModule(AddPathImplModuleFactory.NAME, "add-path-inst-2");
204         final AddPathImplModuleMXBean mxBean2 = transaction.newMXBeanProxy(name2, AddPathImplModuleMXBean.class);
205         mxBean2.setAddressFamily(AddPathImplModuleTest.createAddressFamily(transaction, "add-path-inst-2"));
206         mxBean2.setSendReceive(SendReceive.Receive);
207
208         final List<ObjectName> ret = new ArrayList<ObjectName>();
209         ret.add(name1);
210         ret.add(name2);
211         return ret;
212     }
213
214     private static ObjectName createPeerRegistry(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
215         return transaction.createModule(StrictBgpPeerRegistryModuleFactory.NAME, "peer-registry");
216     }
217
218     private static BGPDispatcherImplModuleMXBean getBgpDispatcherImplModuleMXBean(final ConfigTransactionJMXClient transaction,
219             final BGPPeerModuleMXBean mxBean) {
220         final RIBImplModuleMXBean ribProxy = transaction.newMXBeanProxy(mxBean.getRib(), RIBImplModuleMXBean.class);
221         final ObjectName dispatcherON = ribProxy.getBgpDispatcher();
222         return transaction.newMXBeanProxy(dispatcherON, BGPDispatcherImplModuleMXBean.class);
223     }
224
225     private CommitStatus createBgpPeerInstance() throws Exception {
226         return createBgpPeerInstance(false);
227     }
228
229     private CommitStatus createBgpPeerInstance(final boolean md5) throws Exception {
230         return createBgpPeerInstance(HOST, portNumber, md5);
231     }
232
233     private CommitStatus createBgpPeerInstance(final IpAddress host, final PortNumber port, final boolean md5) throws Exception {
234         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
235         createBgpPeerInstance(transaction, host, port, md5, false);
236         return transaction.commit();
237     }
238
239     private CommitStatus createInternalBgpPeerInstance()
240         throws Exception {
241         final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
242         createBgpPeerInstance(transaction, HOST, portNumber, false, true);
243         return transaction.commit();
244     }
245 }