blob: 109d23846796ae9fa96e277997a36793c69ebb0f [file] [log] [blame]
tom578ebdc2014-09-11 11:12:51 -07001package org.onlab.onos.net.trivial.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;
tom96dfcab2014-08-28 09:26:03 -070024import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070025import org.onlab.onos.net.provider.AbstractProviderService;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070026import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070027import org.onlab.packet.MacAddress;
28import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070029import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070030
tom7869ad92014-09-09 14:32:08 -070031import java.util.Set;
32
33import static com.google.common.base.Preconditions.checkNotNull;
tom5f38b3a2014-08-27 23:50:54 -070034import static org.slf4j.LoggerFactory.getLogger;
tomdb0d03f2014-08-27 16:34:15 -070035
36/**
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
121 public void addListener(HostListener listener) {
122 listenerRegistry.addListener(listener);
123 }
124
125 @Override
126 public void removeListener(HostListener listener) {
127 listenerRegistry.removeListener(listener);
128 }
129
tom89b63c52014-09-16 09:19:51 -0700130 @Override
131 public void removeHost(HostId hostId) {
132 checkNotNull(hostId, HOST_ID_NULL);
133 HostEvent event = store.removeHost(hostId);
134 if (event != null) {
135 log.info("Host {} administratively removed", hostId);
136 post(event);
137 }
138 }
139
tomdb0d03f2014-08-27 16:34:15 -0700140 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700141 private class InternalHostProviderService
142 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700143 implements HostProviderService {
144
tomcfde0622014-09-09 11:02:42 -0700145 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700146 super(provider);
147 }
148
149 @Override
tom7869ad92014-09-09 14:32:08 -0700150 public void hostDetected(HostId hostId, HostDescription hostDescription) {
151 checkNotNull(hostId, HOST_ID_NULL);
152 checkValidity();
153 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
154 hostDescription);
155 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700156 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700157 post(event);
158 }
tomdb0d03f2014-08-27 16:34:15 -0700159 }
160
161 @Override
tom7869ad92014-09-09 14:32:08 -0700162 public void hostVanished(HostId hostId) {
163 checkNotNull(hostId, HOST_ID_NULL);
164 checkValidity();
165 HostEvent event = store.removeHost(hostId);
166 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700167 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700168 post(event);
169 }
tomdb0d03f2014-08-27 16:34:15 -0700170 }
171 }
tom7869ad92014-09-09 14:32:08 -0700172
173 // Posts the specified event to the local event dispatcher.
174 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700175 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700176 eventDispatcher.post(event);
177 }
178 }
179
tomdb0d03f2014-08-27 16:34:15 -0700180}