Merge "Adding Set Next Hop action"
[controller.git] / opendaylight / hosttracker / integrationtest / src / test / java / org / opendaylight / controller / hosttracker / internal / HostTrackerIT.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.controller.hosttracker.internal;\r
10 \r
11 import java.net.InetAddress;\r
12 import java.net.UnknownHostException;\r
13 import java.util.ArrayList;\r
14 import java.util.HashSet;\r
15 import java.util.Iterator;\r
16 import java.util.List;\r
17 import java.util.Map;\r
18 import java.util.Set;\r
19 import java.util.Map.Entry;\r
20 \r
21 import org.slf4j.Logger;\r
22 import org.slf4j.LoggerFactory;\r
23 import org.osgi.framework.ServiceReference;\r
24 import org.osgi.framework.Bundle;\r
25 import javax.inject.Inject;\r
26 \r
27 import org.eclipse.osgi.framework.console.CommandProvider;\r
28 import org.junit.Assert;\r
29 import org.junit.Test;\r
30 import org.junit.Before;\r
31 import org.junit.After;\r
32 import org.junit.runner.RunWith;\r
33 import org.opendaylight.controller.sal.core.Node;\r
34 import org.opendaylight.controller.sal.core.NodeConnector;\r
35 import org.opendaylight.controller.sal.core.UpdateType;\r
36 import org.opendaylight.controller.sal.utils.NodeConnectorCreator;\r
37 import org.opendaylight.controller.sal.utils.NodeCreator;\r
38 import org.opendaylight.controller.sal.utils.Status;\r
39 //import org.opendaylight.controller.hosttracker.*;\r
40 import org.opendaylight.controller.hosttracker.IfIptoHost;\r
41 import org.opendaylight.controller.hosttracker.IfHostListener;\r
42 import org.opendaylight.controller.hosttracker.hostAware.HostNodeConnector;\r
43 import org.opendaylight.controller.switchmanager.IInventoryListener;\r
44 import org.opendaylight.controller.switchmanager.ISwitchManager;\r
45 import org.opendaylight.controller.switchmanager.ISwitchManagerAware;\r
46 import org.opendaylight.controller.topologymanager.ITopologyManagerAware;\r
47 \r
48 import org.ops4j.pax.exam.junit.PaxExam;\r
49 import org.ops4j.pax.exam.util.Filter;\r
50 import org.osgi.framework.BundleContext;\r
51 import static org.junit.Assert.*;\r
52 import org.ops4j.pax.exam.junit.Configuration;\r
53 import static org.ops4j.pax.exam.CoreOptions.*;\r
54 \r
55 import org.ops4j.pax.exam.Option;\r
56 import org.ops4j.pax.exam.util.PathUtils;\r
57 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;\r
58 import org.ops4j.pax.exam.spi.reactors.PerClass;\r
59 \r
60 @RunWith(PaxExam.class)\r
61 public class HostTrackerIT {\r
62     private Logger log = LoggerFactory\r
63             .getLogger(HostTrackerIT.class);\r
64     // get the OSGI bundle context\r
65     @Inject\r
66     private BundleContext bc;\r
67 \r
68     private IfIptoHost hosttracker = null;\r
69     private ISwitchManagerAware switchManagerAware = null;\r
70     private IInventoryListener invtoryListener = null;\r
71     private IfHostListener hostListener = null;\r
72     private ITopologyManagerAware topologyManagerAware = null;\r
73 \r
74     // Configure the OSGi container\r
75     @Configuration\r
76     public Option[] config() {\r
77         return options(\r
78                 //\r
79                 systemProperty("logback.configurationFile").value(\r
80                         "file:" + PathUtils.getBaseDir()\r
81                                 + "/src/test/resources/logback.xml"),\r
82                 // To start OSGi console for inspection remotely\r
83                 systemProperty("osgi.console").value("2401"),\r
84                 // Set the systemPackages (used by clustering)\r
85                 systemPackages("sun.reflect", "sun.reflect.misc", "sun.misc"),\r
86                 // List framework bundles\r
87                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.console",\r
88                         "1.0.0.v20120522-1841"),\r
89                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.util",\r
90                         "1.0.400.v20120522-2049"),\r
91                 mavenBundle("equinoxSDK381", "org.eclipse.osgi.services",\r
92                         "3.3.100.v20120522-1822"),\r
93                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.ds",\r
94                         "1.4.0.v20120522-1841"),\r
95                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.command",\r
96                         "0.8.0.v201108120515"),\r
97                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.runtime",\r
98                         "0.8.0.v201108120515"),\r
99                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell",\r
100                         "0.8.0.v201110170705"),\r
101                 // List logger bundles\r
102                 mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(),\r
103                 mavenBundle("org.slf4j", "log4j-over-slf4j")\r
104                         .versionAsInProject(),\r
105                 mavenBundle("ch.qos.logback", "logback-core")\r
106                         .versionAsInProject(),\r
107                 mavenBundle("ch.qos.logback", "logback-classic")\r
108                         .versionAsInProject(),\r
109 \r
110                 // List all the bundles on which the test case depends\r
111                 mavenBundle("org.opendaylight.controller", "sal")\r
112                         .versionAsInProject(),\r
113                 mavenBundle("org.opendaylight.controller", "sal.implementation")\r
114                         .versionAsInProject(),\r
115 \r
116                 // needed by statisticsmanager\r
117                 mavenBundle("org.opendaylight.controller", "containermanager")\r
118                         .versionAsInProject(),\r
119                 mavenBundle("org.opendaylight.controller",\r
120                         "containermanager.implementation").versionAsInProject(),\r
121 \r
122                 mavenBundle("org.opendaylight.controller",\r
123                         "clustering.services").versionAsInProject(),\r
124                 mavenBundle("org.opendaylight.controller", "clustering.stub")\r
125                         .versionAsInProject(),\r
126 \r
127                 // needed by forwardingrulesmanager\r
128                 mavenBundle("org.opendaylight.controller", "switchmanager")\r
129                         .versionAsInProject(),\r
130                 mavenBundle("org.opendaylight.controller",\r
131                         "switchmanager.implementation").versionAsInProject(),\r
132                 mavenBundle("org.opendaylight.controller", "configuration")\r
133                         .versionAsInProject(),\r
134                 mavenBundle("org.opendaylight.controller",\r
135                         "configuration.implementation").versionAsInProject(),\r
136                 mavenBundle("org.opendaylight.controller", "hosttracker")\r
137                         .versionAsInProject(),\r
138                 mavenBundle("org.opendaylight.controller",\r
139                         "hosttracker.implementation").versionAsInProject(),\r
140 \r
141                 // needed by hosttracker\r
142                 mavenBundle("org.opendaylight.controller", "topologymanager")\r
143                         .versionAsInProject(),\r
144                 mavenBundle("org.opendaylight.controller", "arphandler")\r
145                         .versionAsInProject(),\r
146 \r
147                 mavenBundle("org.jboss.spec.javax.transaction",\r
148                         "jboss-transaction-api_1.1_spec").versionAsInProject(),\r
149                 mavenBundle("org.apache.commons", "commons-lang3")\r
150                         .versionAsInProject(),\r
151                 mavenBundle("org.apache.felix",\r
152                         "org.apache.felix.dependencymanager")\r
153                         .versionAsInProject(), junitBundles());\r
154     }\r
155 \r
156     private String stateToString(int state) {\r
157         switch (state) {\r
158         case Bundle.ACTIVE:\r
159             return "ACTIVE";\r
160         case Bundle.INSTALLED:\r
161             return "INSTALLED";\r
162         case Bundle.RESOLVED:\r
163             return "RESOLVED";\r
164         case Bundle.UNINSTALLED:\r
165             return "UNINSTALLED";\r
166         default:\r
167             return "Not CONVERTED";\r
168         }\r
169     }\r
170 \r
171     @Before\r
172     public void areWeReady() {\r
173         assertNotNull(bc);\r
174         boolean debugit = false;\r
175         Bundle b[] = bc.getBundles();\r
176         for (int i = 0; i < b.length; i++) {\r
177             int state = b[i].getState();\r
178             if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {\r
179                 log.debug("Bundle:" + b[i].getSymbolicName() + " state:"\r
180                         + stateToString(state));\r
181                 debugit = true;\r
182             }\r
183         }\r
184         if (debugit) {\r
185             log.debug("Do some debugging because some bundle is "\r
186                     + "unresolved");\r
187         }\r
188 \r
189         // Assert if true, if false we are good to go!\r
190         assertFalse(debugit);\r
191 \r
192         // Now lets create a hosttracker for testing purpose\r
193         ServiceReference s = bc.getServiceReference(IfIptoHost.class.getName());\r
194         if (s != null) {\r
195             this.hosttracker = (IfIptoHost) bc.getService(s);\r
196             this.switchManagerAware = (ISwitchManagerAware) this.hosttracker;\r
197             this.invtoryListener = (IInventoryListener) this.hosttracker;\r
198             this.hostListener = (IfHostListener) this.hosttracker;\r
199             this.topologyManagerAware = (ITopologyManagerAware) this.hosttracker;\r
200         }\r
201 \r
202         // If StatisticsManager is null, cannot run tests.\r
203         assertNotNull(this.hosttracker);\r
204     }\r
205 \r
206     @Test\r
207     public void testStaticHost() throws UnknownHostException {\r
208         String ip;\r
209 \r
210         assertNotNull(this.hosttracker);\r
211 \r
212         // create one node and two node connectors\r
213         Node node1 = NodeCreator.createOFNode(1L);\r
214         NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(\r
215                 (short) 1, node1);\r
216         NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(\r
217                 (short) 2, node1);\r
218 \r
219         // test addStaticHost(), store into inactive host DB\r
220         Status st = this.hosttracker.addStaticHost("192.168.0.8",\r
221                 "11:22:33:44:55:66", nc1_1, "0");\r
222         Assert.assertTrue(st.isSuccess());\r
223         st = this.hosttracker.addStaticHost("192.168.0.13",\r
224                 "11:22:33:44:55:77", nc1_2, "0");\r
225         Assert.assertTrue(st.isSuccess());\r
226 \r
227         // check inactive DB\r
228         Iterator<HostNodeConnector> hnci = this.hosttracker\r
229                 .getInactiveStaticHosts().iterator();\r
230         while (hnci.hasNext()) {\r
231             ip = hnci.next().getNetworkAddressAsString();\r
232             Assert.assertTrue(ip.equals("192.168.0.8")\r
233                     || ip.equals("192.168.0.13"));\r
234         }\r
235 \r
236         // check active host DB\r
237         hnci = this.hosttracker.getActiveStaticHosts().iterator();\r
238         Assert.assertFalse(hnci.hasNext());\r
239 \r
240         // test removeStaticHost()\r
241         st = this.hosttracker.removeStaticHost("192.168.0.8");\r
242         Assert.assertTrue(st.isSuccess());\r
243 \r
244         hnci = this.hosttracker.getInactiveStaticHosts().iterator();\r
245         while (hnci.hasNext()) {\r
246             ip = hnci.next().getNetworkAddressAsString();\r
247             Assert.assertTrue(ip.equals("192.168.0.13"));\r
248         }\r
249     }\r
250 \r
251     @Test\r
252     public void testNotifyNodeConnector() throws UnknownHostException {\r
253         String ip;\r
254 \r
255         assertNotNull(this.invtoryListener);\r
256 \r
257         // create one node and two node connectors\r
258         Node node1 = NodeCreator.createOFNode(1L);\r
259         NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(\r
260                 (short) 1, node1);\r
261         NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(\r
262                 (short) 2, node1);\r
263 \r
264         // test addStaticHost(), put into inactive host DB if not verifiable\r
265         Status st = this.hosttracker.addStaticHost("192.168.0.8",\r
266                 "11:22:33:44:55:66", nc1_1, "0");\r
267         st = this.hosttracker.addStaticHost("192.168.0.13",\r
268                 "11:22:33:44:55:77", nc1_2, "0");\r
269 \r
270         this.invtoryListener.notifyNodeConnector(nc1_1, UpdateType.ADDED, null);\r
271 \r
272         // check all host list\r
273         Iterator<HostNodeConnector> hnci = this.hosttracker.getAllHosts()\r
274                 .iterator();\r
275         while (hnci.hasNext()) {\r
276             ip = hnci.next().getNetworkAddressAsString();\r
277             Assert.assertTrue(ip.equals("192.168.0.8"));\r
278         }\r
279 \r
280         // check active host DB\r
281         hnci = this.hosttracker.getActiveStaticHosts().iterator();\r
282         while (hnci.hasNext()) {\r
283             ip = hnci.next().getNetworkAddressAsString();\r
284             Assert.assertTrue(ip.equals("192.168.0.8"));\r
285         }\r
286 \r
287         // check inactive host DB\r
288         hnci = this.hosttracker.getInactiveStaticHosts().iterator();\r
289         while (hnci.hasNext()) {\r
290             ip = hnci.next().getNetworkAddressAsString();\r
291             Assert.assertTrue(ip.equals("192.168.0.13"));\r
292         }\r
293     }\r
294 \r
295     @Test\r
296     public void testHostFind() throws UnknownHostException {\r
297 \r
298         assertNotNull(this.invtoryListener);\r
299 \r
300         // create one node and two node connectors\r
301         Node node1 = NodeCreator.createOFNode(1L);\r
302         NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(\r
303                 (short) 1, node1);\r
304         NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(\r
305                 (short) 2, node1);\r
306 \r
307         // test addStaticHost(), put into inactive host DB if not verifiable\r
308         Status st = this.hosttracker.addStaticHost("192.168.0.8",\r
309                 "11:22:33:44:55:66", nc1_1, "0");\r
310         st = this.hosttracker.addStaticHost("192.168.0.13",\r
311                 "11:22:33:44:55:77", nc1_2, "0");\r
312 \r
313         HostNodeConnector hnc_1 = this.hosttracker.hostFind(InetAddress\r
314                 .getByName("192.168.0.8"));\r
315         assertNull(hnc_1);\r
316 \r
317         this.invtoryListener.notifyNodeConnector(nc1_1, UpdateType.ADDED, null);\r
318 \r
319         hnc_1 = this.hosttracker.hostFind(InetAddress.getByName("192.168.0.8"));\r
320         assertNotNull(hnc_1);\r
321 \r
322     }\r
323 \r
324 }\r