blob: b42f1af5c3dab90c6d28e37a890e8817e6e734cc [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;
tomdb0d03f2014-08-27 16:34:15 -070015import org.onlab.onos.net.host.HostDescription;
tom5f38b3a2014-08-27 23:50:54 -070016import org.onlab.onos.net.host.HostEvent;
17import org.onlab.onos.net.host.HostListener;
tomdb0d03f2014-08-27 16:34:15 -070018import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070019import org.onlab.onos.net.host.HostProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070020import org.onlab.onos.net.host.HostProviderService;
tom7869ad92014-09-09 14:32:08 -070021import org.onlab.onos.net.host.HostService;
tom96dfcab2014-08-28 09:26:03 -070022import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070023import org.onlab.onos.net.provider.AbstractProviderService;
Ayaka Koshibe1c7b38e2014-09-11 13:09:51 -070024import org.onlab.packet.IPAddress;
tom7869ad92014-09-09 14:32:08 -070025import org.onlab.packet.MACAddress;
Ayaka Koshibe04a1a4e2014-09-11 14:31:29 -070026import org.onlab.packet.VLANID;
tomdb0d03f2014-08-27 16:34:15 -070027import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070028
tom7869ad92014-09-09 14:32:08 -070029import java.util.Set;
30
31import static com.google.common.base.Preconditions.checkNotNull;
tom5f38b3a2014-08-27 23:50:54 -070032import static org.slf4j.LoggerFactory.getLogger;
tomdb0d03f2014-08-27 16:34:15 -070033
34/**
35 * Provides basic implementation of the host SB & NB APIs.
36 */
37@Component(immediate = true)
38@Service
tom5f38b3a2014-08-27 23:50:54 -070039public class SimpleHostManager
tom96dfcab2014-08-28 09:26:03 -070040 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom7869ad92014-09-09 14:32:08 -070041 implements HostService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070042
tom7869ad92014-09-09 14:32:08 -070043 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070044 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070045
tom96dfcab2014-08-28 09:26:03 -070046 private final AbstractListenerRegistry<HostEvent, HostListener>
47 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070048
tom7869ad92014-09-09 14:32:08 -070049 private final SimpleHostStore store = new SimpleHostStore();
50
tom5f38b3a2014-08-27 23:50:54 -070051 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom96dfcab2014-08-28 09:26:03 -070052 private EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070053
tomdb0d03f2014-08-27 16:34:15 -070054
55 @Activate
56 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070057 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070058 log.info("Started");
59 }
60
61 @Deactivate
62 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070063 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070064 log.info("Stopped");
65 }
66
67 @Override
tom5f38b3a2014-08-27 23:50:54 -070068 protected HostProviderService createProviderService(HostProvider provider) {
69 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070070 }
71
tom7869ad92014-09-09 14:32:08 -070072 @Override
73 public int getHostCount() {
74 return store.getHostCount();
75 }
76
77 @Override
78 public Iterable<Host> getHosts() {
79 return store.getHosts();
80 }
81
82 @Override
83 public Host getHost(HostId hostId) {
84 checkNotNull(hostId, HOST_ID_NULL);
85 return store.getHost(hostId);
86 }
87
88 @Override
Ayaka Koshibe04a1a4e2014-09-11 14:31:29 -070089 public Set<Host> getHostsByVlan(VLANID vlanId) {
tom7869ad92014-09-09 14:32:08 -070090 return store.getHosts(vlanId);
91 }
92
93 @Override
94 public Set<Host> getHostsByMac(MACAddress mac) {
95 checkNotNull(mac, "MAC address cannot be null");
96 return store.getHosts(mac);
97 }
98
99 @Override
Ayaka Koshibe1c7b38e2014-09-11 13:09:51 -0700100 public Set<Host> getHostsByIp(IPAddress ip) {
tom7869ad92014-09-09 14:32:08 -0700101 checkNotNull(ip, "IP address cannot be null");
102 return store.getHosts(ip);
103 }
104
105 @Override
106 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
107 checkNotNull(connectPoint, "Connection point cannot be null");
108 return store.getConnectedHosts(connectPoint);
109 }
110
111 @Override
112 public Set<Host> getConnectedHosts(DeviceId deviceId) {
113 checkNotNull(deviceId, "Device ID cannot be null");
114 return store.getConnectedHosts(deviceId);
115 }
116
117 @Override
118 public void addListener(HostListener listener) {
119 listenerRegistry.addListener(listener);
120 }
121
122 @Override
123 public void removeListener(HostListener listener) {
124 listenerRegistry.removeListener(listener);
125 }
126
tomdb0d03f2014-08-27 16:34:15 -0700127 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700128 private class InternalHostProviderService
129 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700130 implements HostProviderService {
131
tomcfde0622014-09-09 11:02:42 -0700132 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700133 super(provider);
134 }
135
136 @Override
tom7869ad92014-09-09 14:32:08 -0700137 public void hostDetected(HostId hostId, HostDescription hostDescription) {
138 checkNotNull(hostId, HOST_ID_NULL);
139 checkValidity();
140 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
141 hostDescription);
142 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700143 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700144 post(event);
145 }
tomdb0d03f2014-08-27 16:34:15 -0700146 }
147
148 @Override
tom7869ad92014-09-09 14:32:08 -0700149 public void hostVanished(HostId hostId) {
150 checkNotNull(hostId, HOST_ID_NULL);
151 checkValidity();
152 HostEvent event = store.removeHost(hostId);
153 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700154 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700155 post(event);
156 }
tomdb0d03f2014-08-27 16:34:15 -0700157 }
158 }
tom7869ad92014-09-09 14:32:08 -0700159
160 // Posts the specified event to the local event dispatcher.
161 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700162 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700163 eventDispatcher.post(event);
164 }
165 }
166
tomdb0d03f2014-08-27 16:34:15 -0700167}