blob: e3f53fe2efb6aff3785593299ea66ce5d52cdc0f [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.host.impl;
tomdb0d03f2014-08-27 16:34:15 -07002
3import org.apache.felix.scr.annotations.Activate;
4import org.apache.felix.scr.annotations.Component;
5import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -07006import org.apache.felix.scr.annotations.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -07008import org.apache.felix.scr.annotations.Service;
tom96dfcab2014-08-28 09:26:03 -07009import org.onlab.onos.event.AbstractListenerRegistry;
10import org.onlab.onos.event.EventDeliveryService;
tom7869ad92014-09-09 14:32:08 -070011import org.onlab.onos.net.ConnectPoint;
12import org.onlab.onos.net.DeviceId;
13import org.onlab.onos.net.Host;
14import org.onlab.onos.net.HostId;
tom89b63c52014-09-16 09:19:51 -070015import org.onlab.onos.net.host.HostAdminService;
tomdb0d03f2014-08-27 16:34:15 -070016import org.onlab.onos.net.host.HostDescription;
tom5f38b3a2014-08-27 23:50:54 -070017import org.onlab.onos.net.host.HostEvent;
18import org.onlab.onos.net.host.HostListener;
tomdb0d03f2014-08-27 16:34:15 -070019import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070020import org.onlab.onos.net.host.HostProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070021import org.onlab.onos.net.host.HostProviderService;
tom7869ad92014-09-09 14:32:08 -070022import org.onlab.onos.net.host.HostService;
tom5bcc9462014-09-19 10:11:31 -070023import org.onlab.onos.net.host.HostStore;
tomc78acee2014-09-24 15:16:55 -070024import org.onlab.onos.net.host.HostStoreDelegate;
Jonathan Hartac60c082014-09-23 08:55:17 -070025import org.onlab.onos.net.host.PortAddresses;
tom96dfcab2014-08-28 09:26:03 -070026import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070027import org.onlab.onos.net.provider.AbstractProviderService;
Jonathan Hartac60c082014-09-23 08:55:17 -070028import org.onlab.packet.IpAddress;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070029import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070030import org.onlab.packet.MacAddress;
31import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070032import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070033
tomc78acee2014-09-24 15:16:55 -070034import java.util.Set;
35
36import static com.google.common.base.Preconditions.checkNotNull;
37import static org.slf4j.LoggerFactory.getLogger;
38
tomdb0d03f2014-08-27 16:34:15 -070039/**
40 * Provides basic implementation of the host SB & NB APIs.
41 */
42@Component(immediate = true)
43@Service
tom202175a2014-09-19 19:00:11 -070044public class HostManager
tom96dfcab2014-08-28 09:26:03 -070045 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070046 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070047
tom7869ad92014-09-09 14:32:08 -070048 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070049 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070050
tom96dfcab2014-08-28 09:26:03 -070051 private final AbstractListenerRegistry<HostEvent, HostListener>
52 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070053
tomc78acee2014-09-24 15:16:55 -070054 private HostStoreDelegate delegate = new InternalStoreDelegate();
55
tom5bcc9462014-09-19 10:11:31 -070056 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070058
tom5f38b3a2014-08-27 23:50:54 -070059 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070060 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070061
tomdb0d03f2014-08-27 16:34:15 -070062
63 @Activate
64 public void activate() {
tomc78acee2014-09-24 15:16:55 -070065 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -070066 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070067 log.info("Started");
68 }
69
70 @Deactivate
71 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070072 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -070073 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070074 log.info("Stopped");
75 }
76
77 @Override
tom5f38b3a2014-08-27 23:50:54 -070078 protected HostProviderService createProviderService(HostProvider provider) {
79 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070080 }
81
tom7869ad92014-09-09 14:32:08 -070082 @Override
83 public int getHostCount() {
84 return store.getHostCount();
85 }
86
87 @Override
88 public Iterable<Host> getHosts() {
89 return store.getHosts();
90 }
91
92 @Override
93 public Host getHost(HostId hostId) {
94 checkNotNull(hostId, HOST_ID_NULL);
95 return store.getHost(hostId);
96 }
97
98 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070099 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -0700100 return store.getHosts(vlanId);
101 }
102
103 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700104 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -0700105 checkNotNull(mac, "MAC address cannot be null");
106 return store.getHosts(mac);
107 }
108
109 @Override
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700110 public Set<Host> getHostsByIp(IpPrefix ip) {
tom7869ad92014-09-09 14:32:08 -0700111 checkNotNull(ip, "IP address cannot be null");
112 return store.getHosts(ip);
113 }
114
115 @Override
116 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
117 checkNotNull(connectPoint, "Connection point cannot be null");
118 return store.getConnectedHosts(connectPoint);
119 }
120
121 @Override
122 public Set<Host> getConnectedHosts(DeviceId deviceId) {
123 checkNotNull(deviceId, "Device ID cannot be null");
124 return store.getConnectedHosts(deviceId);
125 }
126
127 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700128 public void startMonitoringIp(IpAddress ip) {
129 // TODO pass through to HostMonitor
Jonathan Hartfca736c2014-09-19 17:26:59 -0700130 }
131
132 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700133 public void stopMonitoringIp(IpAddress ip) {
134 // TODO pass through to HostMonitor
135 }
136
137 @Override
138 public void requestMac(IpAddress ip) {
139 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700140 }
141
142 @Override
tom7869ad92014-09-09 14:32:08 -0700143 public void addListener(HostListener listener) {
144 listenerRegistry.addListener(listener);
145 }
146
147 @Override
148 public void removeListener(HostListener listener) {
149 listenerRegistry.removeListener(listener);
150 }
151
tom89b63c52014-09-16 09:19:51 -0700152 @Override
153 public void removeHost(HostId hostId) {
154 checkNotNull(hostId, HOST_ID_NULL);
155 HostEvent event = store.removeHost(hostId);
156 if (event != null) {
157 log.info("Host {} administratively removed", hostId);
158 post(event);
159 }
160 }
161
Jonathan Hartac60c082014-09-23 08:55:17 -0700162 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700163 public void bindAddressesToPort(PortAddresses addresses) {
164 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700165 }
166
167 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700168 public void unbindAddressesFromPort(PortAddresses portAddresses) {
169 store.removeAddressBindings(portAddresses);
170 }
171
172 @Override
173 public void clearAddresses(ConnectPoint connectPoint) {
174 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700175 }
176
177 @Override
178 public Set<PortAddresses> getAddressBindings() {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700179 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700180 }
181
182 @Override
183 public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700184 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700185 }
186
tomdb0d03f2014-08-27 16:34:15 -0700187 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700188 private class InternalHostProviderService
189 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700190 implements HostProviderService {
191
tomcfde0622014-09-09 11:02:42 -0700192 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700193 super(provider);
194 }
195
196 @Override
tom7869ad92014-09-09 14:32:08 -0700197 public void hostDetected(HostId hostId, HostDescription hostDescription) {
198 checkNotNull(hostId, HOST_ID_NULL);
199 checkValidity();
200 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
201 hostDescription);
202 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700203 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700204 post(event);
205 }
tomdb0d03f2014-08-27 16:34:15 -0700206 }
207
208 @Override
tom7869ad92014-09-09 14:32:08 -0700209 public void hostVanished(HostId hostId) {
210 checkNotNull(hostId, HOST_ID_NULL);
211 checkValidity();
212 HostEvent event = store.removeHost(hostId);
213 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700214 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700215 post(event);
216 }
tomdb0d03f2014-08-27 16:34:15 -0700217 }
218 }
tom7869ad92014-09-09 14:32:08 -0700219
220 // Posts the specified event to the local event dispatcher.
221 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700222 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700223 eventDispatcher.post(event);
224 }
225 }
226
tomc78acee2014-09-24 15:16:55 -0700227 // Store delegate to re-post events emitted from the store.
228 private class InternalStoreDelegate implements HostStoreDelegate {
229 @Override
230 public void notify(HostEvent event) {
231 post(event);
232 }
233 }
tomdb0d03f2014-08-27 16:34:15 -0700234}