2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
\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
9 package org.opendaylight.controller.hosttracker.internal;
\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
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
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
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
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
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
66 private BundleContext bc;
\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
74 // Configure the OSGi container
\r
76 public Option[] config() {
\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
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
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
122 mavenBundle("org.opendaylight.controller",
\r
123 "clustering.services").versionAsInProject(),
\r
124 mavenBundle("org.opendaylight.controller", "clustering.stub")
\r
125 .versionAsInProject(),
\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
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
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
156 private String stateToString(int state) {
\r
158 case Bundle.ACTIVE:
\r
160 case Bundle.INSTALLED:
\r
161 return "INSTALLED";
\r
162 case Bundle.RESOLVED:
\r
164 case Bundle.UNINSTALLED:
\r
165 return "UNINSTALLED";
\r
167 return "Not CONVERTED";
\r
172 public void areWeReady() {
\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
185 log.debug("Do some debugging because some bundle is "
\r
189 // Assert if true, if false we are good to go!
\r
190 assertFalse(debugit);
\r
192 // Now lets create a hosttracker for testing purpose
\r
193 ServiceReference s = bc.getServiceReference(IfIptoHost.class.getName());
\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
202 // If StatisticsManager is null, cannot run tests.
\r
203 assertNotNull(this.hosttracker);
\r
207 public void testStaticHost() throws UnknownHostException {
\r
210 assertNotNull(this.hosttracker);
\r
212 // create one node and two node connectors
\r
213 Node node1 = NodeCreator.createOFNode(1L);
\r
214 NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(
\r
216 NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(
\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
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
236 // check active host DB
\r
237 hnci = this.hosttracker.getActiveStaticHosts().iterator();
\r
238 Assert.assertFalse(hnci.hasNext());
\r
240 // test removeStaticHost()
\r
241 st = this.hosttracker.removeStaticHost("192.168.0.8");
\r
242 Assert.assertTrue(st.isSuccess());
\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
252 public void testNotifyNodeConnector() throws UnknownHostException {
\r
255 assertNotNull(this.invtoryListener);
\r
257 // create one node and two node connectors
\r
258 Node node1 = NodeCreator.createOFNode(1L);
\r
259 NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(
\r
261 NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(
\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
270 this.invtoryListener.notifyNodeConnector(nc1_1, UpdateType.ADDED, null);
\r
272 // check all host list
\r
273 Iterator<HostNodeConnector> hnci = this.hosttracker.getAllHosts()
\r
275 while (hnci.hasNext()) {
\r
276 ip = hnci.next().getNetworkAddressAsString();
\r
277 Assert.assertTrue(ip.equals("192.168.0.8"));
\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
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
296 public void testHostFind() throws UnknownHostException {
\r
298 assertNotNull(this.invtoryListener);
\r
300 // create one node and two node connectors
\r
301 Node node1 = NodeCreator.createOFNode(1L);
\r
302 NodeConnector nc1_1 = NodeConnectorCreator.createOFNodeConnector(
\r
304 NodeConnector nc1_2 = NodeConnectorCreator.createOFNodeConnector(
\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
313 HostNodeConnector hnc_1 = this.hosttracker.hostFind(InetAddress
\r
314 .getByName("192.168.0.8"));
\r
317 this.invtoryListener.notifyNodeConnector(nc1_1, UpdateType.ADDED, null);
\r
319 hnc_1 = this.hosttracker.hostFind(InetAddress.getByName("192.168.0.8"));
\r
320 assertNotNull(hnc_1);
\r