blob: 4f9bcbb6beeb8ea4d0f65ae4b60822e113b2ba62 [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 Koshibe1d56fe42014-09-19 16:51:58 -070036import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070037import org.onlab.packet.MacAddress;
38import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070039import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070040
tomdb0d03f2014-08-27 16:34:15 -070041/**
42 * Provides basic implementation of the host SB & NB APIs.
43 */
44@Component(immediate = true)
45@Service
tom202175a2014-09-19 19:00:11 -070046public class HostManager
tom96dfcab2014-08-28 09:26:03 -070047 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070048 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070049
tom7869ad92014-09-09 14:32:08 -070050 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070051 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070052
tom96dfcab2014-08-28 09:26:03 -070053 private final AbstractListenerRegistry<HostEvent, HostListener>
54 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070055
tomc78acee2014-09-24 15:16:55 -070056 private HostStoreDelegate delegate = new InternalStoreDelegate();
57
tom5bcc9462014-09-19 10:11:31 -070058 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070060
tom5f38b3a2014-08-27 23:50:54 -070061 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070062 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070063
Jonathan Hart70da5122014-10-01 16:37:42 -070064 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected DeviceService deviceService;
66
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected PacketService packetService;
69
70 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -070071
72 @Activate
73 public void activate() {
Jonathan Hart70da5122014-10-01 16:37:42 -070074 log.info("Started");
tomc78acee2014-09-24 15:16:55 -070075 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -070076 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
Jonathan Hart70da5122014-10-01 16:37:42 -070077
78 monitor = new HostMonitor(deviceService, packetService, this);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -070079 monitor.start();
tomdb0d03f2014-08-27 16:34:15 -070080 }
81
82 @Deactivate
83 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070084 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -070085 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070086 log.info("Stopped");
87 }
88
89 @Override
tom5f38b3a2014-08-27 23:50:54 -070090 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -070091 monitor.registerHostProvider(provider);
92
tom5f38b3a2014-08-27 23:50:54 -070093 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070094 }
95
tom7869ad92014-09-09 14:32:08 -070096 @Override
97 public int getHostCount() {
98 return store.getHostCount();
99 }
100
101 @Override
102 public Iterable<Host> getHosts() {
103 return store.getHosts();
104 }
105
106 @Override
107 public Host getHost(HostId hostId) {
108 checkNotNull(hostId, HOST_ID_NULL);
109 return store.getHost(hostId);
110 }
111
112 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700113 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -0700114 return store.getHosts(vlanId);
115 }
116
117 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700118 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -0700119 checkNotNull(mac, "MAC address cannot be null");
120 return store.getHosts(mac);
121 }
122
123 @Override
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700124 public Set<Host> getHostsByIp(IpPrefix ip) {
tom7869ad92014-09-09 14:32:08 -0700125 checkNotNull(ip, "IP address cannot be null");
126 return store.getHosts(ip);
127 }
128
129 @Override
130 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
131 checkNotNull(connectPoint, "Connection point cannot be null");
132 return store.getConnectedHosts(connectPoint);
133 }
134
135 @Override
136 public Set<Host> getConnectedHosts(DeviceId deviceId) {
137 checkNotNull(deviceId, "Device ID cannot be null");
138 return store.getConnectedHosts(deviceId);
139 }
140
141 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700142 public void startMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700143 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700144 }
145
146 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700147 public void stopMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700148 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700149 }
150
151 @Override
152 public void requestMac(IpAddress ip) {
153 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700154 }
155
156 @Override
tom7869ad92014-09-09 14:32:08 -0700157 public void addListener(HostListener listener) {
158 listenerRegistry.addListener(listener);
159 }
160
161 @Override
162 public void removeListener(HostListener listener) {
163 listenerRegistry.removeListener(listener);
164 }
165
tom89b63c52014-09-16 09:19:51 -0700166 @Override
167 public void removeHost(HostId hostId) {
168 checkNotNull(hostId, HOST_ID_NULL);
169 HostEvent event = store.removeHost(hostId);
170 if (event != null) {
tom89b63c52014-09-16 09:19:51 -0700171 post(event);
172 }
173 }
174
Jonathan Hartac60c082014-09-23 08:55:17 -0700175 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700176 public void bindAddressesToPort(PortAddresses addresses) {
177 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700178 }
179
180 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700181 public void unbindAddressesFromPort(PortAddresses portAddresses) {
182 store.removeAddressBindings(portAddresses);
183 }
184
185 @Override
186 public void clearAddresses(ConnectPoint connectPoint) {
187 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700188 }
189
190 @Override
191 public Set<PortAddresses> getAddressBindings() {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700192 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700193 }
194
195 @Override
196 public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700197 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700198 }
199
tomdb0d03f2014-08-27 16:34:15 -0700200 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700201 private class InternalHostProviderService
202 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700203 implements HostProviderService {
204
tomcfde0622014-09-09 11:02:42 -0700205 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700206 super(provider);
207 }
208
209 @Override
tom7869ad92014-09-09 14:32:08 -0700210 public void hostDetected(HostId hostId, HostDescription hostDescription) {
211 checkNotNull(hostId, HOST_ID_NULL);
212 checkValidity();
213 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
214 hostDescription);
215 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700216 post(event);
217 }
tomdb0d03f2014-08-27 16:34:15 -0700218 }
219
220 @Override
tom7869ad92014-09-09 14:32:08 -0700221 public void hostVanished(HostId hostId) {
222 checkNotNull(hostId, HOST_ID_NULL);
223 checkValidity();
224 HostEvent event = store.removeHost(hostId);
225 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700226 post(event);
227 }
tomdb0d03f2014-08-27 16:34:15 -0700228 }
229 }
tom7869ad92014-09-09 14:32:08 -0700230
231 // Posts the specified event to the local event dispatcher.
232 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700233 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700234 eventDispatcher.post(event);
235 }
236 }
237
tomc78acee2014-09-24 15:16:55 -0700238 // Store delegate to re-post events emitted from the store.
239 private class InternalStoreDelegate implements HostStoreDelegate {
240 @Override
241 public void notify(HostEvent event) {
242 post(event);
243 }
244 }
tomdb0d03f2014-08-27 16:34:15 -0700245}