blob: e2c9858dbd6d16d60da6ce5c4d154eda1656ccd3 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.host.impl;
tomdb0d03f2014-08-27 16:34:15 -07002
Jonathan Hartfca736c2014-09-19 17:26:59 -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;
tom89b63c52014-09-16 09:19:51 -070020import org.onlab.onos.net.host.HostAdminService;
tomdb0d03f2014-08-27 16:34:15 -070021import org.onlab.onos.net.host.HostDescription;
tom5f38b3a2014-08-27 23:50:54 -070022import org.onlab.onos.net.host.HostEvent;
23import org.onlab.onos.net.host.HostListener;
tomdb0d03f2014-08-27 16:34:15 -070024import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070025import org.onlab.onos.net.host.HostProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070026import org.onlab.onos.net.host.HostProviderService;
tom7869ad92014-09-09 14:32:08 -070027import org.onlab.onos.net.host.HostService;
tom5bcc9462014-09-19 10:11:31 -070028import org.onlab.onos.net.host.HostStore;
Jonathan Hartac60c082014-09-23 08:55:17 -070029import org.onlab.onos.net.host.PortAddresses;
tom96dfcab2014-08-28 09:26:03 -070030import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070031import org.onlab.onos.net.provider.AbstractProviderService;
Jonathan Hartac60c082014-09-23 08:55:17 -070032import org.onlab.packet.IpAddress;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070033import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070034import org.onlab.packet.MacAddress;
35import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070036import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070037
tomdb0d03f2014-08-27 16:34:15 -070038/**
39 * Provides basic implementation of the host SB & NB APIs.
40 */
41@Component(immediate = true)
42@Service
tom202175a2014-09-19 19:00:11 -070043public class HostManager
tom96dfcab2014-08-28 09:26:03 -070044 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070045 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070046
tom7869ad92014-09-09 14:32:08 -070047 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070048 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070049
tom96dfcab2014-08-28 09:26:03 -070050 private final AbstractListenerRegistry<HostEvent, HostListener>
51 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070052
tom5bcc9462014-09-19 10:11:31 -070053 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070055
tom5f38b3a2014-08-27 23:50:54 -070056 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070057 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070058
tomdb0d03f2014-08-27 16:34:15 -070059
60 @Activate
61 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070062 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070063 log.info("Started");
64 }
65
66 @Deactivate
67 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070068 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070069 log.info("Stopped");
70 }
71
72 @Override
tom5f38b3a2014-08-27 23:50:54 -070073 protected HostProviderService createProviderService(HostProvider provider) {
74 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070075 }
76
tom7869ad92014-09-09 14:32:08 -070077 @Override
78 public int getHostCount() {
79 return store.getHostCount();
80 }
81
82 @Override
83 public Iterable<Host> getHosts() {
84 return store.getHosts();
85 }
86
87 @Override
88 public Host getHost(HostId hostId) {
89 checkNotNull(hostId, HOST_ID_NULL);
90 return store.getHost(hostId);
91 }
92
93 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070094 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -070095 return store.getHosts(vlanId);
96 }
97
98 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070099 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -0700100 checkNotNull(mac, "MAC address cannot be null");
101 return store.getHosts(mac);
102 }
103
104 @Override
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700105 public Set<Host> getHostsByIp(IpPrefix ip) {
tom7869ad92014-09-09 14:32:08 -0700106 checkNotNull(ip, "IP address cannot be null");
107 return store.getHosts(ip);
108 }
109
110 @Override
111 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
112 checkNotNull(connectPoint, "Connection point cannot be null");
113 return store.getConnectedHosts(connectPoint);
114 }
115
116 @Override
117 public Set<Host> getConnectedHosts(DeviceId deviceId) {
118 checkNotNull(deviceId, "Device ID cannot be null");
119 return store.getConnectedHosts(deviceId);
120 }
121
122 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700123 public void startMonitoringIp(IpAddress ip) {
124 // TODO pass through to HostMonitor
Jonathan Hartfca736c2014-09-19 17:26:59 -0700125 }
126
127 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700128 public void stopMonitoringIp(IpAddress ip) {
129 // TODO pass through to HostMonitor
130 }
131
132 @Override
133 public void requestMac(IpAddress ip) {
134 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700135 }
136
137 @Override
tom7869ad92014-09-09 14:32:08 -0700138 public void addListener(HostListener listener) {
139 listenerRegistry.addListener(listener);
140 }
141
142 @Override
143 public void removeListener(HostListener listener) {
144 listenerRegistry.removeListener(listener);
145 }
146
tom89b63c52014-09-16 09:19:51 -0700147 @Override
148 public void removeHost(HostId hostId) {
149 checkNotNull(hostId, HOST_ID_NULL);
150 HostEvent event = store.removeHost(hostId);
151 if (event != null) {
152 log.info("Host {} administratively removed", hostId);
153 post(event);
154 }
155 }
156
Jonathan Hartac60c082014-09-23 08:55:17 -0700157 @Override
158 public void bindAddressesToPort(IpAddress ip, MacAddress mac,
159 ConnectPoint connectPoint) {
160 // TODO Auto-generated method stub
161
162 }
163
164 @Override
165 public void unbindAddressesFromPort(ConnectPoint connectPoint) {
166 // TODO Auto-generated method stub
167
168 }
169
170 @Override
171 public Set<PortAddresses> getAddressBindings() {
172 // TODO Auto-generated method stub
173 return null;
174 }
175
176 @Override
177 public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
178 // TODO Auto-generated method stub
179 return null;
180 }
181
tomdb0d03f2014-08-27 16:34:15 -0700182 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700183 private class InternalHostProviderService
184 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700185 implements HostProviderService {
186
tomcfde0622014-09-09 11:02:42 -0700187 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700188 super(provider);
189 }
190
191 @Override
tom7869ad92014-09-09 14:32:08 -0700192 public void hostDetected(HostId hostId, HostDescription hostDescription) {
193 checkNotNull(hostId, HOST_ID_NULL);
194 checkValidity();
195 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
196 hostDescription);
197 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700198 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700199 post(event);
200 }
tomdb0d03f2014-08-27 16:34:15 -0700201 }
202
203 @Override
tom7869ad92014-09-09 14:32:08 -0700204 public void hostVanished(HostId hostId) {
205 checkNotNull(hostId, HOST_ID_NULL);
206 checkValidity();
207 HostEvent event = store.removeHost(hostId);
208 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700209 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700210 post(event);
211 }
tomdb0d03f2014-08-27 16:34:15 -0700212 }
213 }
tom7869ad92014-09-09 14:32:08 -0700214
215 // Posts the specified event to the local event dispatcher.
216 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700217 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700218 eventDispatcher.post(event);
219 }
220 }
221
tomdb0d03f2014-08-27 16:34:15 -0700222}