blob: 5aae395639c6ee8d64b6ec920508fa2c6f6dd29b [file] [log] [blame]
tom578ebdc2014-09-11 11:12:51 -07001package org.onlab.onos.net.trivial.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;
tom96dfcab2014-08-28 09:26:03 -070029import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070030import org.onlab.onos.net.provider.AbstractProviderService;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070031import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070032import org.onlab.packet.MacAddress;
33import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070034import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070035
tomdb0d03f2014-08-27 16:34:15 -070036/**
37 * Provides basic implementation of the host SB & NB APIs.
38 */
39@Component(immediate = true)
40@Service
tom5f38b3a2014-08-27 23:50:54 -070041public class SimpleHostManager
tom96dfcab2014-08-28 09:26:03 -070042 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070043 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070044
tom7869ad92014-09-09 14:32:08 -070045 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070046 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070047
tom96dfcab2014-08-28 09:26:03 -070048 private final AbstractListenerRegistry<HostEvent, HostListener>
49 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070050
tom5bcc9462014-09-19 10:11:31 -070051 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
52 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070053
tom5f38b3a2014-08-27 23:50:54 -070054 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070055 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070056
tomdb0d03f2014-08-27 16:34:15 -070057
58 @Activate
59 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070060 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070061 log.info("Started");
62 }
63
64 @Deactivate
65 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070066 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070067 log.info("Stopped");
68 }
69
70 @Override
tom5f38b3a2014-08-27 23:50:54 -070071 protected HostProviderService createProviderService(HostProvider provider) {
72 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070073 }
74
tom7869ad92014-09-09 14:32:08 -070075 @Override
76 public int getHostCount() {
77 return store.getHostCount();
78 }
79
80 @Override
81 public Iterable<Host> getHosts() {
82 return store.getHosts();
83 }
84
85 @Override
86 public Host getHost(HostId hostId) {
87 checkNotNull(hostId, HOST_ID_NULL);
88 return store.getHost(hostId);
89 }
90
91 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070092 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -070093 return store.getHosts(vlanId);
94 }
95
96 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070097 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -070098 checkNotNull(mac, "MAC address cannot be null");
99 return store.getHosts(mac);
100 }
101
102 @Override
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700103 public Set<Host> getHostsByIp(IpPrefix ip) {
tom7869ad92014-09-09 14:32:08 -0700104 checkNotNull(ip, "IP address cannot be null");
105 return store.getHosts(ip);
106 }
107
108 @Override
109 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
110 checkNotNull(connectPoint, "Connection point cannot be null");
111 return store.getConnectedHosts(connectPoint);
112 }
113
114 @Override
115 public Set<Host> getConnectedHosts(DeviceId deviceId) {
116 checkNotNull(deviceId, "Device ID cannot be null");
117 return store.getConnectedHosts(deviceId);
118 }
119
120 @Override
Jonathan Hartfca736c2014-09-19 17:26:59 -0700121 public void monitorIp(IpPrefix ip) {
122 // TODO pass through to SimpleHostMonitor
123 }
124
125 @Override
126 public void stopMonitoringIp(IpPrefix ip) {
127 // TODO pass through to SimpleHostMonitor
128 }
129
130 @Override
tom7869ad92014-09-09 14:32:08 -0700131 public void addListener(HostListener listener) {
132 listenerRegistry.addListener(listener);
133 }
134
135 @Override
136 public void removeListener(HostListener listener) {
137 listenerRegistry.removeListener(listener);
138 }
139
tom89b63c52014-09-16 09:19:51 -0700140 @Override
141 public void removeHost(HostId hostId) {
142 checkNotNull(hostId, HOST_ID_NULL);
143 HostEvent event = store.removeHost(hostId);
144 if (event != null) {
145 log.info("Host {} administratively removed", hostId);
146 post(event);
147 }
148 }
149
tomdb0d03f2014-08-27 16:34:15 -0700150 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700151 private class InternalHostProviderService
152 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700153 implements HostProviderService {
154
tomcfde0622014-09-09 11:02:42 -0700155 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700156 super(provider);
157 }
158
159 @Override
tom7869ad92014-09-09 14:32:08 -0700160 public void hostDetected(HostId hostId, HostDescription hostDescription) {
161 checkNotNull(hostId, HOST_ID_NULL);
162 checkValidity();
163 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
164 hostDescription);
165 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700166 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700167 post(event);
168 }
tomdb0d03f2014-08-27 16:34:15 -0700169 }
170
171 @Override
tom7869ad92014-09-09 14:32:08 -0700172 public void hostVanished(HostId hostId) {
173 checkNotNull(hostId, HOST_ID_NULL);
174 checkValidity();
175 HostEvent event = store.removeHost(hostId);
176 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700177 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700178 post(event);
179 }
tomdb0d03f2014-08-27 16:34:15 -0700180 }
181 }
tom7869ad92014-09-09 14:32:08 -0700182
183 // Posts the specified event to the local event dispatcher.
184 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700185 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700186 eventDispatcher.post(event);
187 }
188 }
189
tomdb0d03f2014-08-27 16:34:15 -0700190}