blob: 5b5e5b7455ed09070a2b18d7970a1171bf4b0c09 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
tombe988312014-09-19 18:38:47 -070016package org.onlab.onos.net.host.impl;
tomdb0d03f2014-08-27 16:34:15 -070017
Jonathan Hart70da5122014-10-01 16:37:42 -070018import static com.google.common.base.Preconditions.checkNotNull;
19import static org.slf4j.LoggerFactory.getLogger;
20
21import java.util.Set;
22
tomdb0d03f2014-08-27 16:34:15 -070023import org.apache.felix.scr.annotations.Activate;
24import org.apache.felix.scr.annotations.Component;
25import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -070026import org.apache.felix.scr.annotations.Reference;
27import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -070028import org.apache.felix.scr.annotations.Service;
tom96dfcab2014-08-28 09:26:03 -070029import org.onlab.onos.event.AbstractListenerRegistry;
30import org.onlab.onos.event.EventDeliveryService;
tom7869ad92014-09-09 14:32:08 -070031import org.onlab.onos.net.ConnectPoint;
32import org.onlab.onos.net.DeviceId;
33import org.onlab.onos.net.Host;
34import org.onlab.onos.net.HostId;
Jonathan Hart70da5122014-10-01 16:37:42 -070035import org.onlab.onos.net.device.DeviceService;
tom89b63c52014-09-16 09:19:51 -070036import org.onlab.onos.net.host.HostAdminService;
tomdb0d03f2014-08-27 16:34:15 -070037import org.onlab.onos.net.host.HostDescription;
tom5f38b3a2014-08-27 23:50:54 -070038import org.onlab.onos.net.host.HostEvent;
39import org.onlab.onos.net.host.HostListener;
tomdb0d03f2014-08-27 16:34:15 -070040import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070041import org.onlab.onos.net.host.HostProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070042import org.onlab.onos.net.host.HostProviderService;
tom7869ad92014-09-09 14:32:08 -070043import org.onlab.onos.net.host.HostService;
tom5bcc9462014-09-19 10:11:31 -070044import org.onlab.onos.net.host.HostStore;
tomc78acee2014-09-24 15:16:55 -070045import org.onlab.onos.net.host.HostStoreDelegate;
Jonathan Hartac60c082014-09-23 08:55:17 -070046import org.onlab.onos.net.host.PortAddresses;
Jonathan Hart70da5122014-10-01 16:37:42 -070047import org.onlab.onos.net.packet.PacketService;
tom96dfcab2014-08-28 09:26:03 -070048import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070049import org.onlab.onos.net.provider.AbstractProviderService;
Jonathan Hartac60c082014-09-23 08:55:17 -070050import org.onlab.packet.IpAddress;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070051import org.onlab.packet.MacAddress;
52import org.onlab.packet.VlanId;
tomdb0d03f2014-08-27 16:34:15 -070053import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070054
tomdb0d03f2014-08-27 16:34:15 -070055/**
56 * Provides basic implementation of the host SB & NB APIs.
57 */
58@Component(immediate = true)
59@Service
tom202175a2014-09-19 19:00:11 -070060public class HostManager
tom96dfcab2014-08-28 09:26:03 -070061 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070062 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070063
tom7869ad92014-09-09 14:32:08 -070064 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070065 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070066
tom96dfcab2014-08-28 09:26:03 -070067 private final AbstractListenerRegistry<HostEvent, HostListener>
68 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070069
tomc78acee2014-09-24 15:16:55 -070070 private HostStoreDelegate delegate = new InternalStoreDelegate();
71
tom5bcc9462014-09-19 10:11:31 -070072 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
73 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070074
tom5f38b3a2014-08-27 23:50:54 -070075 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070076 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070077
Jonathan Hart70da5122014-10-01 16:37:42 -070078 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 protected DeviceService deviceService;
80
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected PacketService packetService;
83
84 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -070085
86 @Activate
87 public void activate() {
Jonathan Hart70da5122014-10-01 16:37:42 -070088 log.info("Started");
tomc78acee2014-09-24 15:16:55 -070089 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -070090 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
Jonathan Hart70da5122014-10-01 16:37:42 -070091
92 monitor = new HostMonitor(deviceService, packetService, this);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -070093 monitor.start();
tomdb0d03f2014-08-27 16:34:15 -070094 }
95
96 @Deactivate
97 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070098 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -070099 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -0700100 log.info("Stopped");
101 }
102
103 @Override
tom5f38b3a2014-08-27 23:50:54 -0700104 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700105 monitor.registerHostProvider(provider);
106
tom5f38b3a2014-08-27 23:50:54 -0700107 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -0700108 }
109
tom7869ad92014-09-09 14:32:08 -0700110 @Override
111 public int getHostCount() {
112 return store.getHostCount();
113 }
114
115 @Override
116 public Iterable<Host> getHosts() {
117 return store.getHosts();
118 }
119
120 @Override
121 public Host getHost(HostId hostId) {
122 checkNotNull(hostId, HOST_ID_NULL);
123 return store.getHost(hostId);
124 }
125
126 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700127 public Set<Host> getHostsByVlan(VlanId vlanId) {
tom7869ad92014-09-09 14:32:08 -0700128 return store.getHosts(vlanId);
129 }
130
131 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700132 public Set<Host> getHostsByMac(MacAddress mac) {
tom7869ad92014-09-09 14:32:08 -0700133 checkNotNull(mac, "MAC address cannot be null");
134 return store.getHosts(mac);
135 }
136
137 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700138 public Set<Host> getHostsByIp(IpAddress ip) {
tom7869ad92014-09-09 14:32:08 -0700139 checkNotNull(ip, "IP address cannot be null");
140 return store.getHosts(ip);
141 }
142
143 @Override
144 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
145 checkNotNull(connectPoint, "Connection point cannot be null");
146 return store.getConnectedHosts(connectPoint);
147 }
148
149 @Override
150 public Set<Host> getConnectedHosts(DeviceId deviceId) {
151 checkNotNull(deviceId, "Device ID cannot be null");
152 return store.getConnectedHosts(deviceId);
153 }
154
155 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700156 public void startMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700157 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700158 }
159
160 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700161 public void stopMonitoringIp(IpAddress ip) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700162 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700163 }
164
165 @Override
166 public void requestMac(IpAddress ip) {
167 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700168 }
169
170 @Override
tom7869ad92014-09-09 14:32:08 -0700171 public void addListener(HostListener listener) {
172 listenerRegistry.addListener(listener);
173 }
174
175 @Override
176 public void removeListener(HostListener listener) {
177 listenerRegistry.removeListener(listener);
178 }
179
tom89b63c52014-09-16 09:19:51 -0700180 @Override
181 public void removeHost(HostId hostId) {
182 checkNotNull(hostId, HOST_ID_NULL);
183 HostEvent event = store.removeHost(hostId);
184 if (event != null) {
tom89b63c52014-09-16 09:19:51 -0700185 post(event);
186 }
187 }
188
Jonathan Hartac60c082014-09-23 08:55:17 -0700189 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700190 public void bindAddressesToPort(PortAddresses addresses) {
191 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700192 }
193
194 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700195 public void unbindAddressesFromPort(PortAddresses portAddresses) {
196 store.removeAddressBindings(portAddresses);
197 }
198
199 @Override
200 public void clearAddresses(ConnectPoint connectPoint) {
201 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700202 }
203
204 @Override
205 public Set<PortAddresses> getAddressBindings() {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700206 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700207 }
208
209 @Override
Jonathan Harta887ba82014-11-03 15:20:52 -0800210 public Set<PortAddresses> getAddressBindingsForPort(ConnectPoint connectPoint) {
Jonathan Hart43c182c2014-09-23 11:13:42 -0700211 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700212 }
213
tomdb0d03f2014-08-27 16:34:15 -0700214 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700215 private class InternalHostProviderService
216 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700217 implements HostProviderService {
218
tomcfde0622014-09-09 11:02:42 -0700219 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700220 super(provider);
221 }
222
223 @Override
tom7869ad92014-09-09 14:32:08 -0700224 public void hostDetected(HostId hostId, HostDescription hostDescription) {
225 checkNotNull(hostId, HOST_ID_NULL);
226 checkValidity();
227 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
228 hostDescription);
229 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700230 post(event);
231 }
tomdb0d03f2014-08-27 16:34:15 -0700232 }
233
234 @Override
tom7869ad92014-09-09 14:32:08 -0700235 public void hostVanished(HostId hostId) {
236 checkNotNull(hostId, HOST_ID_NULL);
237 checkValidity();
238 HostEvent event = store.removeHost(hostId);
239 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700240 post(event);
241 }
tomdb0d03f2014-08-27 16:34:15 -0700242 }
243 }
tom7869ad92014-09-09 14:32:08 -0700244
245 // Posts the specified event to the local event dispatcher.
246 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700247 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700248 eventDispatcher.post(event);
249 }
250 }
251
tomc78acee2014-09-24 15:16:55 -0700252 // Store delegate to re-post events emitted from the store.
253 private class InternalStoreDelegate implements HostStoreDelegate {
254 @Override
255 public void notify(HostEvent event) {
256 post(event);
257 }
258 }
tomdb0d03f2014-08-27 16:34:15 -0700259}