blob: 43e06f552a9a335f9f1ed3372d809387ce4245d7 [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;
tom96dfcab2014-08-28 09:26:03 -070023import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070024import org.onlab.onos.net.provider.AbstractProviderService;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070025import org.onlab.packet.IpAddress;
26import org.onlab.packet.MacAddress;
27import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070028import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070029
tom7869ad92014-09-09 14:32:08 -070030import java.util.Set;
31
32import static com.google.common.base.Preconditions.checkNotNull;
tom5f38b3a2014-08-27 23:50:54 -070033import static org.slf4j.LoggerFactory.getLogger;
tomdb0d03f2014-08-27 16:34:15 -070034
35/**
36 * Provides basic implementation of the host SB & NB APIs.
37 */
38@Component(immediate = true)
39@Service
tom5f38b3a2014-08-27 23:50:54 -070040public class SimpleHostManager
tom96dfcab2014-08-28 09:26:03 -070041 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070042 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070043
tom7869ad92014-09-09 14:32:08 -070044 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070045 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070046
tom96dfcab2014-08-28 09:26:03 -070047 private final AbstractListenerRegistry<HostEvent, HostListener>
48 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070049
tom7869ad92014-09-09 14:32:08 -070050 private final SimpleHostStore store = new SimpleHostStore();
51
tom5f38b3a2014-08-27 23:50:54 -070052 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070053 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070054
tomdb0d03f2014-08-27 16:34:15 -070055
56 @Activate
57 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070058 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070059 log.info("Started");
60 }
61
62 @Deactivate
63 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070064 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070065 log.info("Stopped");
66 }
67
68 @Override
tom5f38b3a2014-08-27 23:50:54 -070069 protected HostProviderService createProviderService(HostProvider provider) {
70 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070071 }
72
tom7869ad92014-09-09 14:32:08 -070073 @Override
74 public int getHostCount() {
75 return store.getHostCount();
76 }
77
78 @Override
79 public Iterable<Host> getHosts() {
80 return store.getHosts();
81 }
82
83 @Override
84 public Host getHost(HostId hostId) {
85 checkNotNull(hostId, HOST_ID_NULL);
86 return store.getHost(hostId);
87 }
88
89 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070090 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -070091 return store.getHosts(vlanId);
92 }
93
94 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070095 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -070096 checkNotNull(mac, "MAC address cannot be null");
97 return store.getHosts(mac);
98 }
99
100 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700101 public Set<Host> getHostsByIp(IpAddress ip) {
tom7869ad92014-09-09 14:32:08 -0700102 checkNotNull(ip, "IP address cannot be null");
103 return store.getHosts(ip);
104 }
105
106 @Override
107 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
108 checkNotNull(connectPoint, "Connection point cannot be null");
109 return store.getConnectedHosts(connectPoint);
110 }
111
112 @Override
113 public Set<Host> getConnectedHosts(DeviceId deviceId) {
114 checkNotNull(deviceId, "Device ID cannot be null");
115 return store.getConnectedHosts(deviceId);
116 }
117
118 @Override
119 public void addListener(HostListener listener) {
120 listenerRegistry.addListener(listener);
121 }
122
123 @Override
124 public void removeListener(HostListener listener) {
125 listenerRegistry.removeListener(listener);
126 }
127
tom89b63c52014-09-16 09:19:51 -0700128 @Override
129 public void removeHost(HostId hostId) {
130 checkNotNull(hostId, HOST_ID_NULL);
131 HostEvent event = store.removeHost(hostId);
132 if (event != null) {
133 log.info("Host {} administratively removed", hostId);
134 post(event);
135 }
136 }
137
tomdb0d03f2014-08-27 16:34:15 -0700138 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700139 private class InternalHostProviderService
140 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700141 implements HostProviderService {
142
tomcfde0622014-09-09 11:02:42 -0700143 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700144 super(provider);
145 }
146
147 @Override
tom7869ad92014-09-09 14:32:08 -0700148 public void hostDetected(HostId hostId, HostDescription hostDescription) {
149 checkNotNull(hostId, HOST_ID_NULL);
150 checkValidity();
151 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
152 hostDescription);
153 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700154 log.debug("Host {} detected", hostId);
tom7869ad92014-09-09 14:32:08 -0700155 post(event);
156 }
tomdb0d03f2014-08-27 16:34:15 -0700157 }
158
159 @Override
tom7869ad92014-09-09 14:32:08 -0700160 public void hostVanished(HostId hostId) {
161 checkNotNull(hostId, HOST_ID_NULL);
162 checkValidity();
163 HostEvent event = store.removeHost(hostId);
164 if (event != null) {
tomf297f392014-09-15 14:46:49 -0700165 log.debug("Host {} vanished", hostId);
tom7869ad92014-09-09 14:32:08 -0700166 post(event);
167 }
tomdb0d03f2014-08-27 16:34:15 -0700168 }
169 }
tom7869ad92014-09-09 14:32:08 -0700170
171 // Posts the specified event to the local event dispatcher.
172 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700173 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700174 eventDispatcher.post(event);
175 }
176 }
177
tomdb0d03f2014-08-27 16:34:15 -0700178}