blob: e4d158d99cd48195e5588b9dacafd3bb201d7255 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.host.impl;
tomdb0d03f2014-08-27 16:34:15 -07002
Jonathan Hart70da5122014-10-01 16:37:42 -07003import static com.google.common.base.Preconditions.checkNotNull;
4import static org.slf4j.LoggerFactory.getLogger;
5
6import java.util.Set;
7
tomdb0d03f2014-08-27 16:34:15 -07008import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -070011import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -070013import org.apache.felix.scr.annotations.Service;
tom96dfcab2014-08-28 09:26:03 -070014import org.onlab.onos.event.AbstractListenerRegistry;
15import org.onlab.onos.event.EventDeliveryService;
tom7869ad92014-09-09 14:32:08 -070016import org.onlab.onos.net.ConnectPoint;
17import org.onlab.onos.net.DeviceId;
18import org.onlab.onos.net.Host;
19import org.onlab.onos.net.HostId;
Jonathan Hart70da5122014-10-01 16:37:42 -070020import org.onlab.onos.net.device.DeviceService;
tom89b63c52014-09-16 09:19:51 -070021import org.onlab.onos.net.host.HostAdminService;
tomdb0d03f2014-08-27 16:34:15 -070022import org.onlab.onos.net.host.HostDescription;
tom5f38b3a2014-08-27 23:50:54 -070023import org.onlab.onos.net.host.HostEvent;
24import org.onlab.onos.net.host.HostListener;
tomdb0d03f2014-08-27 16:34:15 -070025import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070026import org.onlab.onos.net.host.HostProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070027import org.onlab.onos.net.host.HostProviderService;
tom7869ad92014-09-09 14:32:08 -070028import org.onlab.onos.net.host.HostService;
tom5bcc9462014-09-19 10:11:31 -070029import org.onlab.onos.net.host.HostStore;
tomc78acee2014-09-24 15:16:55 -070030import org.onlab.onos.net.host.HostStoreDelegate;
Jonathan Hartac60c082014-09-23 08:55:17 -070031import org.onlab.onos.net.host.PortAddresses;
Jonathan Hart70da5122014-10-01 16:37:42 -070032import org.onlab.onos.net.packet.PacketService;
tom96dfcab2014-08-28 09:26:03 -070033import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070034import org.onlab.onos.net.provider.AbstractProviderService;
Jonathan Hartac60c082014-09-23 08:55:17 -070035import org.onlab.packet.IpAddress;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070036import org.onlab.packet.MacAddress;
37import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070038import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070039
tomdb0d03f2014-08-27 16:34:15 -070040/**
41 * Provides basic implementation of the host SB & NB APIs.
42 */
43@Component(immediate = true)
44@Service
tom202175a2014-09-19 19:00:11 -070045public class HostManager
tom96dfcab2014-08-28 09:26:03 -070046 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070047 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070048
tom7869ad92014-09-09 14:32:08 -070049 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070050 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070051
tom96dfcab2014-08-28 09:26:03 -070052 private final AbstractListenerRegistry<HostEvent, HostListener>
53 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070054
tomc78acee2014-09-24 15:16:55 -070055 private HostStoreDelegate delegate = new InternalStoreDelegate();
56
tom5bcc9462014-09-19 10:11:31 -070057 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070059
tom5f38b3a2014-08-27 23:50:54 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070061 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070062
Jonathan Hart70da5122014-10-01 16:37:42 -070063 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
64 protected DeviceService deviceService;
65
66 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
67 protected PacketService packetService;
68
69 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -070070
71 @Activate
72 public void activate() {
Jonathan Hart70da5122014-10-01 16:37:42 -070073 log.info("Started");
tomc78acee2014-09-24 15:16:55 -070074 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -070075 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
Jonathan Hart70da5122014-10-01 16:37:42 -070076
77 monitor = new HostMonitor(deviceService, packetService, this);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -070078 monitor.start();
tomdb0d03f2014-08-27 16:34:15 -070079 }
80
81 @Deactivate
82 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070083 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -070084 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070085 log.info("Stopped");
86 }
87
88 @Override
tom5f38b3a2014-08-27 23:50:54 -070089 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -070090 monitor.registerHostProvider(provider);
91
tom5f38b3a2014-08-27 23:50:54 -070092 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070093 }
94
tom7869ad92014-09-09 14:32:08 -070095 @Override
96 public int getHostCount() {
97 return store.getHostCount();
98 }
99
100 @Override
101 public Iterable<Host> getHosts() {
102 return store.getHosts();
103 }
104
105 @Override
106 public Host getHost(HostId hostId) {
107 checkNotNull(hostId, HOST_ID_NULL);
108 return store.getHost(hostId);
109 }
110
111 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700112 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -0700113 return store.getHosts(vlanId);
114 }
115
116 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700117 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -0700118 checkNotNull(mac, "MAC address cannot be null");
119 return store.getHosts(mac);
120 }
121
122 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700123 public Set<Host> getHostsByIp(IpAddress ip) {
tom7869ad92014-09-09 14:32:08 -0700124 checkNotNull(ip, "IP address cannot be null");
125 return store.getHosts(ip);
126 }
127
128 @Override
129 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
130 checkNotNull(connectPoint, "Connection point cannot be null");
131 return store.getConnectedHosts(connectPoint);
132 }
133
134 @Override
135 public Set<Host> getConnectedHosts(DeviceId deviceId) {
136 checkNotNull(deviceId, "Device ID cannot be null");
137 return store.getConnectedHosts(deviceId);
138 }
139
140 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700141 public void startMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700142 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700143 }
144
145 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700146 public void stopMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700147 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700148 }
149
150 @Override
151 public void requestMac(IpAddress ip) {
152 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700153 }
154
155 @Override
tom7869ad92014-09-09 14:32:08 -0700156 public void addListener(HostListener listener) {
157 listenerRegistry.addListener(listener);
158 }
159
160 @Override
161 public void removeListener(HostListener listener) {
162 listenerRegistry.removeListener(listener);
163 }
164
tom89b63c52014-09-16 09:19:51 -0700165 @Override
166 public void removeHost(HostId hostId) {
167 checkNotNull(hostId, HOST_ID_NULL);
168 HostEvent event = store.removeHost(hostId);
169 if (event != null) {
tom89b63c52014-09-16 09:19:51 -0700170 post(event);
171 }
172 }
173
Jonathan Hartac60c082014-09-23 08:55:17 -0700174 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700175 public void bindAddressesToPort(PortAddresses addresses) {
176 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700177 }
178
179 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700180 public void unbindAddressesFromPort(PortAddresses portAddresses) {
181 store.removeAddressBindings(portAddresses);
182 }
183
184 @Override
185 public void clearAddresses(ConnectPoint connectPoint) {
186 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700187 }
188
189 @Override
190 public Set<PortAddresses> getAddressBindings() {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700191 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700192 }
193
194 @Override
195 public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700196 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700197 }
198
tomdb0d03f2014-08-27 16:34:15 -0700199 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700200 private class InternalHostProviderService
201 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700202 implements HostProviderService {
203
tomcfde0622014-09-09 11:02:42 -0700204 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700205 super(provider);
206 }
207
208 @Override
tom7869ad92014-09-09 14:32:08 -0700209 public void hostDetected(HostId hostId, HostDescription hostDescription) {
210 checkNotNull(hostId, HOST_ID_NULL);
211 checkValidity();
212 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
213 hostDescription);
214 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700215 post(event);
216 }
tomdb0d03f2014-08-27 16:34:15 -0700217 }
218
219 @Override
tom7869ad92014-09-09 14:32:08 -0700220 public void hostVanished(HostId hostId) {
221 checkNotNull(hostId, HOST_ID_NULL);
222 checkValidity();
223 HostEvent event = store.removeHost(hostId);
224 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700225 post(event);
226 }
tomdb0d03f2014-08-27 16:34:15 -0700227 }
228 }
tom7869ad92014-09-09 14:32:08 -0700229
230 // Posts the specified event to the local event dispatcher.
231 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700232 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700233 eventDispatcher.post(event);
234 }
235 }
236
tomc78acee2014-09-24 15:16:55 -0700237 // Store delegate to re-post events emitted from the store.
238 private class InternalStoreDelegate implements HostStoreDelegate {
239 @Override
240 public void notify(HostEvent event) {
241 post(event);
242 }
243 }
tomdb0d03f2014-08-27 16:34:15 -0700244}