blob: 3335f5a87ae2ecdcaf3498ef76aec2b2e893b0aa [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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.host.impl;
tomdb0d03f2014-08-27 16:34:15 -070017
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -070021import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -070023import org.apache.felix.scr.annotations.Service;
Simon Huntff663742015-05-14 13:33:05 -070024import org.onlab.packet.IpAddress;
25import org.onlab.packet.MacAddress;
26import org.onlab.packet.VlanId;
Changhoon Yoon541ef712015-05-23 17:18:34 +090027import org.onosproject.core.Permission;
Brian O'Connorabafb502014-12-02 22:26:20 -080028import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070029import org.onosproject.event.ListenerRegistry;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.net.ConnectPoint;
31import org.onosproject.net.DeviceId;
32import org.onosproject.net.Host;
33import org.onosproject.net.HostId;
34import org.onosproject.net.device.DeviceService;
35import org.onosproject.net.host.HostAdminService;
36import org.onosproject.net.host.HostDescription;
37import org.onosproject.net.host.HostEvent;
38import org.onosproject.net.host.HostListener;
39import org.onosproject.net.host.HostProvider;
40import org.onosproject.net.host.HostProviderRegistry;
41import org.onosproject.net.host.HostProviderService;
42import org.onosproject.net.host.HostService;
43import org.onosproject.net.host.HostStore;
44import org.onosproject.net.host.HostStoreDelegate;
45import org.onosproject.net.host.PortAddresses;
46import org.onosproject.net.packet.PacketService;
47import org.onosproject.net.provider.AbstractProviderRegistry;
48import org.onosproject.net.provider.AbstractProviderService;
tomdb0d03f2014-08-27 16:34:15 -070049import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070050
Simon Huntff663742015-05-14 13:33:05 -070051import java.util.Set;
52
53import static com.google.common.base.Preconditions.checkNotNull;
54import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoon541ef712015-05-23 17:18:34 +090055import static org.onosproject.security.AppGuard.checkPermission;
56
Simon Huntff663742015-05-14 13:33:05 -070057
tomdb0d03f2014-08-27 16:34:15 -070058/**
59 * Provides basic implementation of the host SB & NB APIs.
60 */
61@Component(immediate = true)
62@Service
tom202175a2014-09-19 19:00:11 -070063public class HostManager
tom96dfcab2014-08-28 09:26:03 -070064 extends AbstractProviderRegistry<HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070065 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070066
tom7869ad92014-09-09 14:32:08 -070067 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070068 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070069
Simon Huntff663742015-05-14 13:33:05 -070070 private final ListenerRegistry<HostEvent, HostListener>
71 listenerRegistry = new ListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070072
tomc78acee2014-09-24 15:16:55 -070073 private HostStoreDelegate delegate = new InternalStoreDelegate();
74
tom5bcc9462014-09-19 10:11:31 -070075 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
76 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070077
tom5f38b3a2014-08-27 23:50:54 -070078 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Ayaka Koshibeac8e7292014-09-16 16:08:31 -070079 protected EventDeliveryService eventDispatcher;
tom5f38b3a2014-08-27 23:50:54 -070080
Jonathan Hart70da5122014-10-01 16:37:42 -070081 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected DeviceService deviceService;
83
84 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
85 protected PacketService packetService;
86
87 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -070088
89 @Activate
90 public void activate() {
Jonathan Hart70da5122014-10-01 16:37:42 -070091 log.info("Started");
tomc78acee2014-09-24 15:16:55 -070092 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -070093 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
Jonathan Hart70da5122014-10-01 16:37:42 -070094
95 monitor = new HostMonitor(deviceService, packetService, this);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -070096 monitor.start();
tomdb0d03f2014-08-27 16:34:15 -070097 }
98
99 @Deactivate
100 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -0700101 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -0700102 eventDispatcher.removeSink(HostEvent.class);
tomdb0d03f2014-08-27 16:34:15 -0700103 log.info("Stopped");
104 }
105
106 @Override
tom5f38b3a2014-08-27 23:50:54 -0700107 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700108 monitor.registerHostProvider(provider);
109
tom5f38b3a2014-08-27 23:50:54 -0700110 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -0700111 }
112
tom7869ad92014-09-09 14:32:08 -0700113 @Override
114 public int getHostCount() {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900115 checkPermission(Permission.HOST_READ);
116
tom7869ad92014-09-09 14:32:08 -0700117 return store.getHostCount();
118 }
119
120 @Override
121 public Iterable<Host> getHosts() {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900122 checkPermission(Permission.HOST_READ);
123
tom7869ad92014-09-09 14:32:08 -0700124 return store.getHosts();
125 }
126
127 @Override
128 public Host getHost(HostId hostId) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900129 checkPermission(Permission.HOST_READ);
130
tom7869ad92014-09-09 14:32:08 -0700131 checkNotNull(hostId, HOST_ID_NULL);
132 return store.getHost(hostId);
133 }
134
135 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700136 public Set<Host> getHostsByVlan(VlanId vlanId) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900137 checkPermission(Permission.HOST_READ);
138
tom7869ad92014-09-09 14:32:08 -0700139 return store.getHosts(vlanId);
140 }
141
142 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700143 public Set<Host> getHostsByMac(MacAddress mac) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900144 checkPermission(Permission.HOST_READ);
145
tom7869ad92014-09-09 14:32:08 -0700146 checkNotNull(mac, "MAC address cannot be null");
147 return store.getHosts(mac);
148 }
149
150 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700151 public Set<Host> getHostsByIp(IpAddress ip) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900152 checkPermission(Permission.HOST_READ);
153
tom7869ad92014-09-09 14:32:08 -0700154 checkNotNull(ip, "IP address cannot be null");
155 return store.getHosts(ip);
156 }
157
158 @Override
159 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900160 checkPermission(Permission.HOST_READ);
161
tom7869ad92014-09-09 14:32:08 -0700162 checkNotNull(connectPoint, "Connection point cannot be null");
163 return store.getConnectedHosts(connectPoint);
164 }
165
166 @Override
167 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900168 checkPermission(Permission.HOST_READ);
169
tom7869ad92014-09-09 14:32:08 -0700170 checkNotNull(deviceId, "Device ID cannot be null");
171 return store.getConnectedHosts(deviceId);
172 }
173
174 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700175 public void startMonitoringIp(IpAddress ip) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900176 checkPermission(Permission.HOST_EVENT);
177
Jonathan Hart70da5122014-10-01 16:37:42 -0700178 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700179 }
180
181 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700182 public void stopMonitoringIp(IpAddress ip) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900183 checkPermission(Permission.HOST_EVENT);
184
Jonathan Hart70da5122014-10-01 16:37:42 -0700185 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700186 }
187
188 @Override
189 public void requestMac(IpAddress ip) {
190 // TODO Auto-generated method stub
Jonathan Hartfca736c2014-09-19 17:26:59 -0700191 }
192
193 @Override
tom7869ad92014-09-09 14:32:08 -0700194 public void addListener(HostListener listener) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900195 checkPermission(Permission.HOST_EVENT);
196
tom7869ad92014-09-09 14:32:08 -0700197 listenerRegistry.addListener(listener);
198 }
199
200 @Override
201 public void removeListener(HostListener listener) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900202 checkPermission(Permission.HOST_EVENT);
203
tom7869ad92014-09-09 14:32:08 -0700204 listenerRegistry.removeListener(listener);
205 }
206
tom89b63c52014-09-16 09:19:51 -0700207 @Override
208 public void removeHost(HostId hostId) {
209 checkNotNull(hostId, HOST_ID_NULL);
210 HostEvent event = store.removeHost(hostId);
211 if (event != null) {
tom89b63c52014-09-16 09:19:51 -0700212 post(event);
213 }
214 }
215
Jonathan Hartac60c082014-09-23 08:55:17 -0700216 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700217 public void bindAddressesToPort(PortAddresses addresses) {
218 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700219 }
220
221 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700222 public void unbindAddressesFromPort(PortAddresses portAddresses) {
223 store.removeAddressBindings(portAddresses);
224 }
225
226 @Override
227 public void clearAddresses(ConnectPoint connectPoint) {
228 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700229 }
230
231 @Override
232 public Set<PortAddresses> getAddressBindings() {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900233 checkPermission(Permission.HOST_READ);
234
Jonathan Hart43c182c2014-09-23 11:13:42 -0700235 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700236 }
237
238 @Override
Jonathan Harta887ba82014-11-03 15:20:52 -0800239 public Set<PortAddresses> getAddressBindingsForPort(ConnectPoint connectPoint) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900240 checkPermission(Permission.HOST_READ);
241
Jonathan Hart43c182c2014-09-23 11:13:42 -0700242 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700243 }
244
tomdb0d03f2014-08-27 16:34:15 -0700245 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700246 private class InternalHostProviderService
247 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700248 implements HostProviderService {
249
tomcfde0622014-09-09 11:02:42 -0700250 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700251 super(provider);
252 }
253
254 @Override
tom7869ad92014-09-09 14:32:08 -0700255 public void hostDetected(HostId hostId, HostDescription hostDescription) {
256 checkNotNull(hostId, HOST_ID_NULL);
257 checkValidity();
258 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
259 hostDescription);
260 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700261 post(event);
262 }
tomdb0d03f2014-08-27 16:34:15 -0700263 }
264
265 @Override
tom7869ad92014-09-09 14:32:08 -0700266 public void hostVanished(HostId hostId) {
267 checkNotNull(hostId, HOST_ID_NULL);
268 checkValidity();
269 HostEvent event = store.removeHost(hostId);
270 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700271 post(event);
272 }
tomdb0d03f2014-08-27 16:34:15 -0700273 }
274 }
tom7869ad92014-09-09 14:32:08 -0700275
276 // Posts the specified event to the local event dispatcher.
277 private void post(HostEvent event) {
tomdc361b62014-09-09 20:36:52 -0700278 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700279 eventDispatcher.post(event);
280 }
281 }
282
tomc78acee2014-09-24 15:16:55 -0700283 // Store delegate to re-post events emitted from the store.
284 private class InternalStoreDelegate implements HostStoreDelegate {
285 @Override
286 public void notify(HostEvent event) {
287 post(event);
288 }
289 }
tomdb0d03f2014-08-27 16:34:15 -0700290}