Thomas Vachuska
Committed by Gerrit Code Review

Added ability to remove host by CLI and by the provider on device/port down events.

Change-Id: I28de4b6b5bbfb5a00f35e1808bcd916369d7d1a4
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onlab.onos.cli.net;
17 +
18 +import org.apache.karaf.shell.commands.Argument;
19 +import org.apache.karaf.shell.commands.Command;
20 +import org.onlab.onos.cli.AbstractShellCommand;
21 +import org.onlab.onos.net.HostId;
22 +import org.onlab.onos.net.host.HostAdminService;
23 +
24 +/**
25 + * Removes an end-station host.
26 + */
27 +@Command(scope = "onos", name = "host-remove",
28 + description = "Removes an end-station host")
29 +public class HostRemoveCommand extends AbstractShellCommand {
30 +
31 + @Argument(index = 0, name = "id", description = "Host ID",
32 + required = true, multiValued = false)
33 + String id = null;
34 +
35 + @Override
36 + protected void execute() {
37 + get(HostAdminService.class).removeHost(HostId.hostId(id));
38 + }
39 +
40 +}
...@@ -207,6 +207,13 @@ ...@@ -207,6 +207,13 @@
207 <action class="org.onlab.onos.cli.net.HostsListCommand"/> 207 <action class="org.onlab.onos.cli.net.HostsListCommand"/>
208 </command> 208 </command>
209 <command> 209 <command>
210 + <action class="org.onlab.onos.cli.net.HostRemoveCommand"/>
211 + <completers>
212 + <ref component-id="hostIdCompleter"/>
213 + <null/>
214 + </completers>
215 + </command>
216 + <command>
210 <action class="org.onlab.onos.cli.net.AddressBindingsListCommand"/> 217 <action class="org.onlab.onos.cli.net.AddressBindingsListCommand"/>
211 </command> 218 </command>
212 219
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
26 <relativePath>../pom.xml</relativePath> 26 <relativePath>../pom.xml</relativePath>
27 </parent> 27 </parent>
28 28
29 -
30 <artifactId>onos-host-provider</artifactId> 29 <artifactId>onos-host-provider</artifactId>
31 <packaging>bundle</packaging> 30 <packaging>bundle</packaging>
32 31
...@@ -38,8 +37,17 @@ ...@@ -38,8 +37,17 @@
38 <classifier>tests</classifier> 37 <classifier>tests</classifier>
39 <scope>test</scope> 38 <scope>test</scope>
40 </dependency> 39 </dependency>
40 + <dependency>
41 + <groupId>org.osgi</groupId>
42 + <artifactId>org.osgi.compendium</artifactId>
43 + </dependency>
44 + <dependency>
45 + <groupId>org.onlab.onos</groupId>
46 + <artifactId>onlab-osgi</artifactId>
47 + <version>${project.version}</version>
48 + <classifier>tests</classifier>
49 + <scope>test</scope>
50 + </dependency>
41 </dependencies> 51 </dependencies>
42 52
43 -
44 -
45 </project> 53 </project>
......
...@@ -15,22 +15,27 @@ ...@@ -15,22 +15,27 @@
15 */ 15 */
16 package org.onlab.onos.provider.host.impl; 16 package org.onlab.onos.provider.host.impl;
17 17
18 -import static org.slf4j.LoggerFactory.getLogger;
19 -
20 import org.apache.felix.scr.annotations.Activate; 18 import org.apache.felix.scr.annotations.Activate;
21 import org.apache.felix.scr.annotations.Component; 19 import org.apache.felix.scr.annotations.Component;
22 import org.apache.felix.scr.annotations.Deactivate; 20 import org.apache.felix.scr.annotations.Deactivate;
21 +import org.apache.felix.scr.annotations.Modified;
22 +import org.apache.felix.scr.annotations.Property;
23 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.onlab.onos.net.ConnectPoint; 25 import org.onlab.onos.net.ConnectPoint;
26 +import org.onlab.onos.net.DeviceId;
26 import org.onlab.onos.net.Host; 27 import org.onlab.onos.net.Host;
27 import org.onlab.onos.net.HostId; 28 import org.onlab.onos.net.HostId;
28 import org.onlab.onos.net.HostLocation; 29 import org.onlab.onos.net.HostLocation;
30 +import org.onlab.onos.net.device.DeviceEvent;
31 +import org.onlab.onos.net.device.DeviceListener;
32 +import org.onlab.onos.net.device.DeviceService;
29 import org.onlab.onos.net.host.DefaultHostDescription; 33 import org.onlab.onos.net.host.DefaultHostDescription;
30 import org.onlab.onos.net.host.HostDescription; 34 import org.onlab.onos.net.host.HostDescription;
31 import org.onlab.onos.net.host.HostProvider; 35 import org.onlab.onos.net.host.HostProvider;
32 import org.onlab.onos.net.host.HostProviderRegistry; 36 import org.onlab.onos.net.host.HostProviderRegistry;
33 import org.onlab.onos.net.host.HostProviderService; 37 import org.onlab.onos.net.host.HostProviderService;
38 +import org.onlab.onos.net.host.HostService;
34 import org.onlab.onos.net.packet.PacketContext; 39 import org.onlab.onos.net.packet.PacketContext;
35 import org.onlab.onos.net.packet.PacketProcessor; 40 import org.onlab.onos.net.packet.PacketProcessor;
36 import org.onlab.onos.net.packet.PacketService; 41 import org.onlab.onos.net.packet.PacketService;
...@@ -42,8 +47,14 @@ import org.onlab.packet.ARP; ...@@ -42,8 +47,14 @@ import org.onlab.packet.ARP;
42 import org.onlab.packet.Ethernet; 47 import org.onlab.packet.Ethernet;
43 import org.onlab.packet.IpAddress; 48 import org.onlab.packet.IpAddress;
44 import org.onlab.packet.VlanId; 49 import org.onlab.packet.VlanId;
50 +import org.osgi.service.component.ComponentContext;
45 import org.slf4j.Logger; 51 import org.slf4j.Logger;
46 52
53 +import java.util.Dictionary;
54 +import java.util.Set;
55 +
56 +import static org.slf4j.LoggerFactory.getLogger;
57 +
47 /** 58 /**
48 * Provider which uses an OpenFlow controller to detect network 59 * Provider which uses an OpenFlow controller to detect network
49 * end-station hosts. 60 * end-station hosts.
...@@ -62,9 +73,20 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -62,9 +73,20 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 73 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected TopologyService topologyService; 74 protected TopologyService topologyService;
64 75
76 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 + protected HostService hostService;
78 +
79 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 + protected DeviceService deviceService;
81 +
65 private HostProviderService providerService; 82 private HostProviderService providerService;
66 83
67 private final InternalHostProvider processor = new InternalHostProvider(); 84 private final InternalHostProvider processor = new InternalHostProvider();
85 + private final DeviceListener deviceListener = new InternalDeviceListener();
86 +
87 + @Property(name = "hostRemovalEnabled", boolValue = true,
88 + label = "Enable host removal on port/device down events")
89 + private boolean hostRemovalEnabled = true;
68 90
69 91
70 /** 92 /**
...@@ -75,9 +97,11 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -75,9 +97,11 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
75 } 97 }
76 98
77 @Activate 99 @Activate
78 - public void activate() { 100 + public void activate(ComponentContext context) {
101 + modified(context);
79 providerService = providerRegistry.register(this); 102 providerService = providerRegistry.register(this);
80 pktService.addProcessor(processor, 1); 103 pktService.addProcessor(processor, 1);
104 + deviceService.addListener(deviceListener);
81 log.info("Started"); 105 log.info("Started");
82 } 106 }
83 107
...@@ -89,6 +113,20 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -89,6 +113,20 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
89 log.info("Stopped"); 113 log.info("Stopped");
90 } 114 }
91 115
116 + @Modified
117 + public void modified(ComponentContext context) {
118 + Dictionary properties = context.getProperties();
119 + try {
120 + String flag = (String) properties.get("hostRemovalEnabled");
121 + if (flag != null) {
122 + hostRemovalEnabled = flag.equals("true");
123 + }
124 + } catch (Exception e) {
125 + hostRemovalEnabled = true;
126 + }
127 + log.info("Host removal is {}", hostRemovalEnabled ? "enabled" : "disabled");
128 + }
129 +
92 @Override 130 @Override
93 public void triggerProbe(Host host) { 131 public void triggerProbe(Host host) {
94 log.info("Triggering probe on device {}", host); 132 log.info("Triggering probe on device {}", host);
...@@ -120,8 +158,8 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -120,8 +158,8 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
120 if (eth.getEtherType() == Ethernet.TYPE_ARP) { 158 if (eth.getEtherType() == Ethernet.TYPE_ARP) {
121 ARP arp = (ARP) eth.getPayload(); 159 ARP arp = (ARP) eth.getPayload();
122 IpAddress ip = 160 IpAddress ip =
123 - IpAddress.valueOf(IpAddress.Version.INET, 161 + IpAddress.valueOf(IpAddress.Version.INET,
124 - arp.getSenderProtocolAddress()); 162 + arp.getSenderProtocolAddress());
125 HostDescription hdescr = 163 HostDescription hdescr =
126 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip); 164 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
127 providerService.hostDetected(hid, hdescr); 165 providerService.hostDetected(hid, hdescr);
...@@ -135,4 +173,37 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -135,4 +173,37 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
135 } 173 }
136 } 174 }
137 } 175 }
176 +
177 + // Auxiliary listener to device events.
178 + private class InternalDeviceListener implements DeviceListener {
179 + @Override
180 + public void event(DeviceEvent event) {
181 + if (!hostRemovalEnabled) {
182 + return;
183 + }
184 +
185 + DeviceEvent.Type type = event.type();
186 + DeviceId deviceId = event.subject().id();
187 + if (type == DeviceEvent.Type.PORT_UPDATED) {
188 + ConnectPoint point = new ConnectPoint(deviceId, event.port().number());
189 + removeHosts(hostService.getConnectedHosts(point));
190 +
191 + } else if (type == DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED) {
192 + if (!deviceService.isAvailable(deviceId)) {
193 + removeHosts(hostService.getConnectedHosts(deviceId));
194 + }
195 +
196 + } else if (type == DeviceEvent.Type.DEVICE_REMOVED) {
197 + removeHosts(hostService.getConnectedHosts(deviceId));
198 + }
199 + }
200 + }
201 +
202 + // Signals host vanish for all specified hosts.
203 + private void removeHosts(Set<Host> hosts) {
204 + for (Host host : hosts) {
205 + providerService.hostVanished(host.id());
206 + }
207 + }
208 +
138 } 209 }
......
...@@ -15,25 +15,28 @@ ...@@ -15,25 +15,28 @@
15 */ 15 */
16 package org.onlab.onos.provider.host.impl; 16 package org.onlab.onos.provider.host.impl;
17 17
18 -import static org.junit.Assert.assertEquals; 18 +import com.google.common.collect.ImmutableSet;
19 -import static org.junit.Assert.assertNotNull;
20 -import static org.junit.Assert.assertNull;
21 -
22 -import java.nio.ByteBuffer;
23 -import java.util.Set;
24 -
25 import org.junit.After; 19 import org.junit.After;
26 import org.junit.Before; 20 import org.junit.Before;
27 import org.junit.Test; 21 import org.junit.Test;
28 import org.onlab.onos.net.ConnectPoint; 22 import org.onlab.onos.net.ConnectPoint;
23 +import org.onlab.onos.net.DefaultDevice;
24 +import org.onlab.onos.net.DefaultHost;
25 +import org.onlab.onos.net.DefaultPort;
26 +import org.onlab.onos.net.Device;
29 import org.onlab.onos.net.DeviceId; 27 import org.onlab.onos.net.DeviceId;
28 +import org.onlab.onos.net.Host;
30 import org.onlab.onos.net.HostId; 29 import org.onlab.onos.net.HostId;
31 -import org.onlab.onos.net.PortNumber; 30 +import org.onlab.onos.net.HostLocation;
31 +import org.onlab.onos.net.device.DeviceEvent;
32 +import org.onlab.onos.net.device.DeviceListener;
33 +import org.onlab.onos.net.device.DeviceServiceAdapter;
32 import org.onlab.onos.net.flow.TrafficTreatment; 34 import org.onlab.onos.net.flow.TrafficTreatment;
33 import org.onlab.onos.net.host.HostDescription; 35 import org.onlab.onos.net.host.HostDescription;
34 import org.onlab.onos.net.host.HostProvider; 36 import org.onlab.onos.net.host.HostProvider;
35 import org.onlab.onos.net.host.HostProviderRegistry; 37 import org.onlab.onos.net.host.HostProviderRegistry;
36 import org.onlab.onos.net.host.HostProviderService; 38 import org.onlab.onos.net.host.HostProviderService;
39 +import org.onlab.onos.net.host.HostServiceAdapter;
37 import org.onlab.onos.net.packet.DefaultInboundPacket; 40 import org.onlab.onos.net.packet.DefaultInboundPacket;
38 import org.onlab.onos.net.packet.InboundPacket; 41 import org.onlab.onos.net.packet.InboundPacket;
39 import org.onlab.onos.net.packet.OutboundPacket; 42 import org.onlab.onos.net.packet.OutboundPacket;
...@@ -43,13 +46,30 @@ import org.onlab.onos.net.packet.PacketService; ...@@ -43,13 +46,30 @@ import org.onlab.onos.net.packet.PacketService;
43 import org.onlab.onos.net.provider.AbstractProviderService; 46 import org.onlab.onos.net.provider.AbstractProviderService;
44 import org.onlab.onos.net.provider.ProviderId; 47 import org.onlab.onos.net.provider.ProviderId;
45 import org.onlab.onos.net.topology.Topology; 48 import org.onlab.onos.net.topology.Topology;
46 -
47 import org.onlab.onos.net.topology.TopologyServiceAdapter; 49 import org.onlab.onos.net.topology.TopologyServiceAdapter;
50 +import org.onlab.osgi.ComponentContextAdapter;
48 import org.onlab.packet.ARP; 51 import org.onlab.packet.ARP;
52 +import org.onlab.packet.ChassisId;
49 import org.onlab.packet.Ethernet; 53 import org.onlab.packet.Ethernet;
54 +import org.onlab.packet.IpAddress;
50 import org.onlab.packet.MacAddress; 55 import org.onlab.packet.MacAddress;
51 import org.onlab.packet.VlanId; 56 import org.onlab.packet.VlanId;
52 57
58 +import java.nio.ByteBuffer;
59 +import java.util.Dictionary;
60 +import java.util.Hashtable;
61 +import java.util.Set;
62 +
63 +import static org.junit.Assert.*;
64 +import static org.onlab.onos.net.Device.Type.SWITCH;
65 +import static org.onlab.onos.net.DeviceId.deviceId;
66 +import static org.onlab.onos.net.HostId.hostId;
67 +import static org.onlab.onos.net.PortNumber.portNumber;
68 +import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
69 +import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_REMOVED;
70 +import static org.onlab.onos.net.device.DeviceEvent.Type.PORT_UPDATED;
71 +import static org.onlab.packet.VlanId.vlanId;
72 +
53 public class HostLocationProviderTest { 73 public class HostLocationProviderTest {
54 74
55 private static final Integer INPORT = 10; 75 private static final Integer INPORT = 10;
...@@ -57,14 +77,44 @@ public class HostLocationProviderTest { ...@@ -57,14 +77,44 @@ public class HostLocationProviderTest {
57 private static final String DEV2 = "of:2"; 77 private static final String DEV2 = "of:2";
58 private static final String DEV3 = "of:3"; 78 private static final String DEV3 = "of:3";
59 79
60 - private static final VlanId VLAN = VlanId.vlanId(); 80 + private static final VlanId VLAN = vlanId();
61 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01"); 81 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
62 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff"); 82 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
63 private static final byte[] IP = new byte[]{10, 0, 0, 1}; 83 private static final byte[] IP = new byte[]{10, 0, 0, 1};
64 84
85 + private static final IpAddress IP_ADDRESS =
86 + IpAddress.valueOf(IpAddress.Version.INET, IP);
87 + private static final HostLocation LOCATION =
88 + new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
89 +
90 + private static final DefaultHost HOST =
91 + new DefaultHost(ProviderId.NONE, hostId(MAC), MAC,
92 + vlanId(VlanId.UNTAGGED), LOCATION,
93 + ImmutableSet.of(IP_ADDRESS));
94 +
95 + private static final ComponentContextAdapter CTX_FOR_REMOVE =
96 + new ComponentContextAdapter() {
97 + @Override
98 + public Dictionary getProperties() {
99 + Hashtable<String, String> props = new Hashtable<>();
100 + props.put("hostRemovalEnabled", "true");
101 + return props;
102 + }
103 + };
104 +
105 + public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
106 + new ComponentContextAdapter() {
107 + @Override
108 + public Dictionary getProperties() {
109 + return new Hashtable();
110 + }
111 + };
112 +
65 private final HostLocationProvider provider = new HostLocationProvider(); 113 private final HostLocationProvider provider = new HostLocationProvider();
66 - private final TestHostRegistry hostService = new TestHostRegistry(); 114 + private final TestHostRegistry hostRegistry = new TestHostRegistry();
67 private final TestTopologyService topoService = new TestTopologyService(); 115 private final TestTopologyService topoService = new TestTopologyService();
116 + private final TestDeviceService deviceService = new TestDeviceService();
117 + private final TestHostService hostService = new TestHostService();
68 private final TestPacketService packetService = new TestPacketService(); 118 private final TestPacketService packetService = new TestPacketService();
69 119
70 private PacketProcessor testProcessor; 120 private PacketProcessor testProcessor;
...@@ -72,12 +122,13 @@ public class HostLocationProviderTest { ...@@ -72,12 +122,13 @@ public class HostLocationProviderTest {
72 122
73 @Before 123 @Before
74 public void setUp() { 124 public void setUp() {
75 - provider.providerRegistry = hostService; 125 + provider.providerRegistry = hostRegistry;
76 provider.topologyService = topoService; 126 provider.topologyService = topoService;
77 provider.pktService = packetService; 127 provider.pktService = packetService;
128 + provider.deviceService = deviceService;
129 + provider.hostService = hostService;
78 130
79 - provider.activate(); 131 + provider.activate(CTX_FOR_NO_REMOVE);
80 -
81 } 132 }
82 133
83 @Test 134 @Test
...@@ -89,8 +140,6 @@ public class HostLocationProviderTest { ...@@ -89,8 +140,6 @@ public class HostLocationProviderTest {
89 @Test 140 @Test
90 public void events() { 141 public void events() {
91 // new host 142 // new host
92 -
93 -
94 testProcessor.process(new TestPacketContext(DEV1)); 143 testProcessor.process(new TestPacketContext(DEV1));
95 assertNotNull("new host expected", providerService.added); 144 assertNotNull("new host expected", providerService.added);
96 assertNull("host motion unexpected", providerService.moved); 145 assertNull("host motion unexpected", providerService.moved);
...@@ -104,6 +153,39 @@ public class HostLocationProviderTest { ...@@ -104,6 +153,39 @@ public class HostLocationProviderTest {
104 assertNull("host misheard on spine switch", providerService.spine); 153 assertNull("host misheard on spine switch", providerService.spine);
105 } 154 }
106 155
156 + @Test
157 + public void removeHostByDeviceRemove() {
158 + provider.modified(CTX_FOR_REMOVE);
159 + testProcessor.process(new TestPacketContext(DEV1));
160 + Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
161 + "m", "h", "s", "n", new ChassisId(0L));
162 + deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
163 + assertEquals("incorrect remove count", 1, providerService.removeCount);
164 + }
165 +
166 + @Test
167 + public void removeHostByDeviceOffline() {
168 + provider.modified(CTX_FOR_REMOVE);
169 + testProcessor.process(new TestPacketContext(DEV1));
170 + Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
171 + "m", "h", "s", "n", new ChassisId(0L));
172 + deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
173 + assertEquals("incorrect remove count", 1, providerService.removeCount);
174 + }
175 +
176 + @Test
177 + public void removeHostByDevicePortDown() {
178 + provider.modified(CTX_FOR_REMOVE);
179 + testProcessor.process(new TestPacketContext(DEV1));
180 + Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
181 + "m", "h", "s", "n", new ChassisId(0L));
182 + deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
183 + new DefaultPort(device, portNumber(INPORT),
184 + false)));
185 + assertEquals("incorrect remove count", 1, providerService.removeCount);
186 + }
187 +
188 +
107 @After 189 @After
108 public void tearDown() { 190 public void tearDown() {
109 provider.deactivate(); 191 provider.deactivate();
...@@ -137,6 +219,7 @@ public class HostLocationProviderTest { ...@@ -137,6 +219,7 @@ public class HostLocationProviderTest {
137 DeviceId added = null; 219 DeviceId added = null;
138 DeviceId moved = null; 220 DeviceId moved = null;
139 DeviceId spine = null; 221 DeviceId spine = null;
222 + public int removeCount;
140 223
141 protected TestHostProviderService(HostProvider provider) { 224 protected TestHostProviderService(HostProvider provider) {
142 super(provider); 225 super(provider);
...@@ -156,6 +239,7 @@ public class HostLocationProviderTest { ...@@ -156,6 +239,7 @@ public class HostLocationProviderTest {
156 239
157 @Override 240 @Override
158 public void hostVanished(HostId hostId) { 241 public void hostVanished(HostId hostId) {
242 + removeCount++;
159 } 243 }
160 244
161 } 245 }
...@@ -169,12 +253,10 @@ public class HostLocationProviderTest { ...@@ -169,12 +253,10 @@ public class HostLocationProviderTest {
169 253
170 @Override 254 @Override
171 public void removeProcessor(PacketProcessor processor) { 255 public void removeProcessor(PacketProcessor processor) {
172 -
173 } 256 }
174 257
175 @Override 258 @Override
176 public void emit(OutboundPacket packet) { 259 public void emit(OutboundPacket packet) {
177 -
178 } 260 }
179 } 261 }
180 262
...@@ -184,7 +266,7 @@ public class HostLocationProviderTest { ...@@ -184,7 +266,7 @@ public class HostLocationProviderTest {
184 public boolean isInfrastructure(Topology topology, 266 public boolean isInfrastructure(Topology topology,
185 ConnectPoint connectPoint) { 267 ConnectPoint connectPoint) {
186 //simulate DPID3 as an infrastructure switch 268 //simulate DPID3 as an infrastructure switch
187 - if ((connectPoint.deviceId()).equals(DeviceId.deviceId(DEV3))) { 269 + if ((connectPoint.deviceId()).equals(deviceId(DEV3))) {
188 return true; 270 return true;
189 } 271 }
190 return false; 272 return false;
...@@ -218,8 +300,8 @@ public class HostLocationProviderTest { ...@@ -218,8 +300,8 @@ public class HostLocationProviderTest {
218 .setSourceMACAddress(MAC.toBytes()) 300 .setSourceMACAddress(MAC.toBytes())
219 .setDestinationMACAddress(BCMAC) 301 .setDestinationMACAddress(BCMAC)
220 .setPayload(arp); 302 .setPayload(arp);
221 - ConnectPoint receivedFrom = new ConnectPoint(DeviceId.deviceId(deviceId), 303 + ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
222 - PortNumber.portNumber(INPORT)); 304 + portNumber(INPORT));
223 return new DefaultInboundPacket(receivedFrom, eth, 305 return new DefaultInboundPacket(receivedFrom, eth,
224 ByteBuffer.wrap(eth.serialize())); 306 ByteBuffer.wrap(eth.serialize()));
225 } 307 }
...@@ -249,4 +331,26 @@ public class HostLocationProviderTest { ...@@ -249,4 +331,26 @@ public class HostLocationProviderTest {
249 return false; 331 return false;
250 } 332 }
251 } 333 }
334 +
335 + private class TestDeviceService extends DeviceServiceAdapter {
336 + private DeviceListener listener;
337 +
338 + @Override
339 + public void addListener(DeviceListener listener) {
340 + this.listener = listener;
341 + }
342 + }
343 +
344 + private class TestHostService extends HostServiceAdapter {
345 + @Override
346 + public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
347 + return ImmutableSet.of(HOST);
348 + }
349 +
350 + @Override
351 + public Set<Host> getConnectedHosts(DeviceId deviceId) {
352 + return ImmutableSet.of(HOST);
353 + }
354 +
355 + }
252 } 356 }
......
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onlab.osgi;
17 +
18 +import org.osgi.framework.Bundle;
19 +import org.osgi.framework.BundleContext;
20 +import org.osgi.framework.ServiceReference;
21 +import org.osgi.service.component.ComponentContext;
22 +import org.osgi.service.component.ComponentInstance;
23 +
24 +import java.util.Dictionary;
25 +
26 +/**
27 + * Adapter implementation of OSGI component context.
28 + */
29 +public class ComponentContextAdapter implements ComponentContext {
30 + @Override
31 + public Dictionary getProperties() {
32 + return null;
33 + }
34 +
35 + @Override
36 + public Object locateService(String name) {
37 + return null;
38 + }
39 +
40 + @Override
41 + public Object locateService(String name, ServiceReference reference) {
42 + return null;
43 + }
44 +
45 + @Override
46 + public Object[] locateServices(String name) {
47 + return new Object[0];
48 + }
49 +
50 + @Override
51 + public BundleContext getBundleContext() {
52 + return null;
53 + }
54 +
55 + @Override
56 + public Bundle getUsingBundle() {
57 + return null;
58 + }
59 +
60 + @Override
61 + public ComponentInstance getComponentInstance() {
62 + return null;
63 + }
64 +
65 + @Override
66 + public void enableComponent(String name) {
67 +
68 + }
69 +
70 + @Override
71 + public void disableComponent(String name) {
72 +
73 + }
74 +
75 + @Override
76 + public ServiceReference getServiceReference() {
77 + return null;
78 + }
79 +}
...@@ -46,6 +46,11 @@ ...@@ -46,6 +46,11 @@
46 <groupId>com.google.guava</groupId> 46 <groupId>com.google.guava</groupId>
47 <artifactId>guava</artifactId> 47 <artifactId>guava</artifactId>
48 </dependency> 48 </dependency>
49 + <dependency>
50 + <groupId>org.osgi</groupId>
51 + <artifactId>org.osgi.compendium</artifactId>
52 + <scope>test</scope>
53 + </dependency>
49 </dependencies> 54 </dependencies>
50 55
51 <build> 56 <build>
......