blob: 26b96eb00fca9c54c0b34da400e162dcf57dafa3 [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;
Jonathan Hart4cb39882015-08-12 23:50:55 -040027import org.onosproject.incubator.net.intf.InterfaceService;
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020028import org.onosproject.net.edge.EdgePortService;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070029import org.onosproject.net.provider.AbstractListenerProviderRegistry;
Ray Milkeya4122362015-08-18 15:19:08 -070030import org.onosproject.net.config.NetworkConfigEvent;
31import org.onosproject.net.config.NetworkConfigListener;
32import org.onosproject.net.config.NetworkConfigService;
Thomas Vachuska4998caa2015-08-26 13:28:38 -070033import org.onosproject.net.config.basics.BasicHostConfig;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.ConnectPoint;
35import org.onosproject.net.DeviceId;
36import org.onosproject.net.Host;
37import org.onosproject.net.HostId;
38import org.onosproject.net.device.DeviceService;
39import org.onosproject.net.host.HostAdminService;
40import org.onosproject.net.host.HostDescription;
41import org.onosproject.net.host.HostEvent;
42import org.onosproject.net.host.HostListener;
43import org.onosproject.net.host.HostProvider;
44import org.onosproject.net.host.HostProviderRegistry;
45import org.onosproject.net.host.HostProviderService;
46import org.onosproject.net.host.HostService;
47import org.onosproject.net.host.HostStore;
48import org.onosproject.net.host.HostStoreDelegate;
49import org.onosproject.net.host.PortAddresses;
50import org.onosproject.net.packet.PacketService;
Brian O'Connorabafb502014-12-02 22:26:20 -080051import org.onosproject.net.provider.AbstractProviderService;
tomdb0d03f2014-08-27 16:34:15 -070052import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070053
Simon Huntff663742015-05-14 13:33:05 -070054import java.util.Set;
55
56import static com.google.common.base.Preconditions.checkNotNull;
Sahil Lele3a0cdd52015-07-21 14:16:31 -070057import static com.google.common.base.Preconditions.checkState;
Changhoon Yoon541ef712015-05-23 17:18:34 +090058import static org.onosproject.security.AppGuard.checkPermission;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070059import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoonb856b812015-08-10 03:47:19 +090060import static org.onosproject.security.AppPermission.Type.*;
Simon Huntff663742015-05-14 13:33:05 -070061
tomdb0d03f2014-08-27 16:34:15 -070062/**
63 * Provides basic implementation of the host SB & NB APIs.
64 */
65@Component(immediate = true)
66@Service
tom202175a2014-09-19 19:00:11 -070067public class HostManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070068 extends AbstractListenerProviderRegistry<HostEvent, HostListener, HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070069 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070070
tom5f38b3a2014-08-27 23:50:54 -070071 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070072
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070073 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070074
Sahil Lele3a0cdd52015-07-21 14:16:31 -070075 private final NetworkConfigListener networkConfigListener = new InternalNetworkConfigListener();
76
tomc78acee2014-09-24 15:16:55 -070077 private HostStoreDelegate delegate = new InternalStoreDelegate();
78
tom5bcc9462014-09-19 10:11:31 -070079 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070081
tom5f38b3a2014-08-27 23:50:54 -070082 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart70da5122014-10-01 16:37:42 -070083 protected DeviceService deviceService;
84
85 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
86 protected PacketService packetService;
87
Sahil Lele3a0cdd52015-07-21 14:16:31 -070088 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 protected NetworkConfigService networkConfigService;
90
Jonathan Hart4cb39882015-08-12 23:50:55 -040091 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 protected InterfaceService interfaceService;
93
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020094 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
95 protected EdgePortService edgePortService;
96
Jonathan Hart70da5122014-10-01 16:37:42 -070097 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -070098
99 @Activate
100 public void activate() {
tomc78acee2014-09-24 15:16:55 -0700101 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -0700102 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700103 networkConfigService.addListener(networkConfigListener);
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200104 monitor = new HostMonitor(packetService, this, interfaceService, edgePortService);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -0700105 monitor.start();
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700106 log.info("Started");
tomdb0d03f2014-08-27 16:34:15 -0700107 }
108
109 @Deactivate
110 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -0700111 store.unsetDelegate(delegate);
tom5f38b3a2014-08-27 23:50:54 -0700112 eventDispatcher.removeSink(HostEvent.class);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700113 networkConfigService.removeListener(networkConfigListener);
tomdb0d03f2014-08-27 16:34:15 -0700114 log.info("Stopped");
115 }
116
117 @Override
tom5f38b3a2014-08-27 23:50:54 -0700118 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700119 monitor.registerHostProvider(provider);
tom5f38b3a2014-08-27 23:50:54 -0700120 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -0700121 }
122
tom7869ad92014-09-09 14:32:08 -0700123 @Override
124 public int getHostCount() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900125 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700126 return store.getHostCount();
127 }
128
129 @Override
130 public Iterable<Host> getHosts() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900131 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700132 return store.getHosts();
133 }
134
135 @Override
136 public Host getHost(HostId hostId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900137 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700138 checkNotNull(hostId, HOST_ID_NULL);
139 return store.getHost(hostId);
140 }
141
142 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700143 public Set<Host> getHostsByVlan(VlanId vlanId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900144 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700145 return store.getHosts(vlanId);
146 }
147
148 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700149 public Set<Host> getHostsByMac(MacAddress mac) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900150 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700151 checkNotNull(mac, "MAC address cannot be null");
152 return store.getHosts(mac);
153 }
154
155 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700156 public Set<Host> getHostsByIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900157 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700158 checkNotNull(ip, "IP address cannot be null");
159 return store.getHosts(ip);
160 }
161
162 @Override
163 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900164 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700165 checkNotNull(connectPoint, "Connection point cannot be null");
166 return store.getConnectedHosts(connectPoint);
167 }
168
169 @Override
170 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900171 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700172 checkNotNull(deviceId, "Device ID cannot be null");
173 return store.getConnectedHosts(deviceId);
174 }
175
176 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700177 public void startMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900178 checkPermission(HOST_EVENT);
Jonathan Hart70da5122014-10-01 16:37:42 -0700179 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700180 }
181
182 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700183 public void stopMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900184 checkPermission(HOST_EVENT);
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) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700190 // FIXME!!!! Auto-generated method stub
tom7869ad92014-09-09 14:32:08 -0700191 }
192
tom89b63c52014-09-16 09:19:51 -0700193 @Override
194 public void removeHost(HostId hostId) {
195 checkNotNull(hostId, HOST_ID_NULL);
196 HostEvent event = store.removeHost(hostId);
197 if (event != null) {
tom89b63c52014-09-16 09:19:51 -0700198 post(event);
199 }
200 }
201
Jonathan Hartac60c082014-09-23 08:55:17 -0700202 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700203 public void bindAddressesToPort(PortAddresses addresses) {
204 store.updateAddressBindings(addresses);
Jonathan Hartac60c082014-09-23 08:55:17 -0700205 }
206
207 @Override
Jonathan Hart09585c62014-09-23 16:58:04 -0700208 public void unbindAddressesFromPort(PortAddresses portAddresses) {
209 store.removeAddressBindings(portAddresses);
210 }
211
212 @Override
213 public void clearAddresses(ConnectPoint connectPoint) {
214 store.clearAddressBindings(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700215 }
216
217 @Override
218 public Set<PortAddresses> getAddressBindings() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900219 checkPermission(HOST_READ);
Jonathan Hart43c182c2014-09-23 11:13:42 -0700220 return store.getAddressBindings();
Jonathan Hartac60c082014-09-23 08:55:17 -0700221 }
222
223 @Override
Jonathan Harta887ba82014-11-03 15:20:52 -0800224 public Set<PortAddresses> getAddressBindingsForPort(ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900225 checkPermission(HOST_READ);
Jonathan Hart43c182c2014-09-23 11:13:42 -0700226 return store.getAddressBindingsForPort(connectPoint);
Jonathan Hartac60c082014-09-23 08:55:17 -0700227 }
228
tomdb0d03f2014-08-27 16:34:15 -0700229 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700230 private class InternalHostProviderService
231 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700232 implements HostProviderService {
tomcfde0622014-09-09 11:02:42 -0700233 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700234 super(provider);
235 }
236
237 @Override
tom7869ad92014-09-09 14:32:08 -0700238 public void hostDetected(HostId hostId, HostDescription hostDescription) {
239 checkNotNull(hostId, HOST_ID_NULL);
240 checkValidity();
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700241 hostDescription = validateHost(hostDescription, hostId);
tom7869ad92014-09-09 14:32:08 -0700242 HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
243 hostDescription);
244 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700245 post(event);
246 }
tomdb0d03f2014-08-27 16:34:15 -0700247 }
248
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700249 // returns a HostDescription made from the union of the BasicHostConfig
250 // annotations if it exists
251 private HostDescription validateHost(HostDescription hostDescription, HostId hostId) {
252 BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
253 checkState(cfg == null || cfg.isAllowed(), "Host {} is not allowed", hostId);
Ayaka Koshibe5373e762015-08-06 12:31:44 -0700254
255 return BasicHostOperator.combine(cfg, hostDescription);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700256 }
257
tomdb0d03f2014-08-27 16:34:15 -0700258 @Override
tom7869ad92014-09-09 14:32:08 -0700259 public void hostVanished(HostId hostId) {
260 checkNotNull(hostId, HOST_ID_NULL);
261 checkValidity();
262 HostEvent event = store.removeHost(hostId);
263 if (event != null) {
tom7869ad92014-09-09 14:32:08 -0700264 post(event);
265 }
tomdb0d03f2014-08-27 16:34:15 -0700266 }
267 }
tom7869ad92014-09-09 14:32:08 -0700268
tomc78acee2014-09-24 15:16:55 -0700269 // Store delegate to re-post events emitted from the store.
270 private class InternalStoreDelegate implements HostStoreDelegate {
271 @Override
272 public void notify(HostEvent event) {
273 post(event);
274 }
275 }
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700276
277 // listens for NetworkConfigEvents of type BasicHostConfig and removes
278 // links that the config does not allow
279 private class InternalNetworkConfigListener implements NetworkConfigListener {
280 @Override
281 public void event(NetworkConfigEvent event) {
282 if ((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
283 event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) &&
284 event.configClass().equals(BasicHostConfig.class)) {
285 log.info("Detected Host network config event {}", event.type());
286 kickOutBadHost(((HostId) event.subject()));
287 }
288 }
289 }
290
291 // checks if the specified host is allowed by the BasicHostConfig
292 // and if not, removes it
293 private void kickOutBadHost(HostId hostId) {
294 BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
295 if (cfg != null && !cfg.isAllowed()) {
296 Host badHost = getHost(hostId);
297 if (badHost != null) {
298 removeHost(hostId);
299 } else {
300 log.info("Failed removal: Host {} does not exist", hostId);
301 }
302 }
303 }
tomdb0d03f2014-08-27 16:34:15 -0700304}