blob: 8a3cf7d532325f520fda29d49bd444d7fa95955e [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
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;
soumya3e6f05e2016-08-05 15:11:11 -070021import org.apache.felix.scr.annotations.Modified;
22import org.apache.felix.scr.annotations.Property;
tom5f38b3a2014-08-27 23:50:54 -070023import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -070025import org.apache.felix.scr.annotations.Service;
Pier Luigi9b1d6262017-02-02 22:31:34 -080026import org.onlab.packet.Ip6Address;
Simon Huntff663742015-05-14 13:33:05 -070027import org.onlab.packet.IpAddress;
28import org.onlab.packet.MacAddress;
29import org.onlab.packet.VlanId;
soumya3e6f05e2016-08-05 15:11:11 -070030import org.onlab.util.Tools;
31import org.onosproject.cfg.ComponentConfigService;
Jonathan Hart4cb39882015-08-12 23:50:55 -040032import org.onosproject.incubator.net.intf.InterfaceService;
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020033import org.onosproject.net.edge.EdgePortService;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070034import org.onosproject.net.provider.AbstractListenerProviderRegistry;
Ray Milkeya4122362015-08-18 15:19:08 -070035import org.onosproject.net.config.NetworkConfigEvent;
36import org.onosproject.net.config.NetworkConfigListener;
37import org.onosproject.net.config.NetworkConfigService;
Thomas Vachuska4998caa2015-08-26 13:28:38 -070038import org.onosproject.net.config.basics.BasicHostConfig;
Brian O'Connorabafb502014-12-02 22:26:20 -080039import org.onosproject.net.ConnectPoint;
40import org.onosproject.net.DeviceId;
41import org.onosproject.net.Host;
42import org.onosproject.net.HostId;
43import org.onosproject.net.device.DeviceService;
44import org.onosproject.net.host.HostAdminService;
45import org.onosproject.net.host.HostDescription;
46import org.onosproject.net.host.HostEvent;
47import org.onosproject.net.host.HostListener;
48import org.onosproject.net.host.HostProvider;
49import org.onosproject.net.host.HostProviderRegistry;
50import org.onosproject.net.host.HostProviderService;
51import org.onosproject.net.host.HostService;
52import org.onosproject.net.host.HostStore;
53import org.onosproject.net.host.HostStoreDelegate;
Brian O'Connorabafb502014-12-02 22:26:20 -080054import org.onosproject.net.packet.PacketService;
Brian O'Connorabafb502014-12-02 22:26:20 -080055import org.onosproject.net.provider.AbstractProviderService;
soumya3e6f05e2016-08-05 15:11:11 -070056import org.osgi.service.component.ComponentContext;
tomdb0d03f2014-08-27 16:34:15 -070057import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070058
soumya3e6f05e2016-08-05 15:11:11 -070059import java.util.Dictionary;
Simon Huntff663742015-05-14 13:33:05 -070060import java.util.Set;
61
62import static com.google.common.base.Preconditions.checkNotNull;
Sahil Lele3a0cdd52015-07-21 14:16:31 -070063import static com.google.common.base.Preconditions.checkState;
Pier Luigi9b1d6262017-02-02 22:31:34 -080064import static org.onlab.packet.IPv6.getLinkLocalAddress;
65import static org.onosproject.net.link.ProbedLinkProvider.DEFAULT_MAC;
Changhoon Yoon541ef712015-05-23 17:18:34 +090066import static org.onosproject.security.AppGuard.checkPermission;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070067import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoonb856b812015-08-10 03:47:19 +090068import static org.onosproject.security.AppPermission.Type.*;
Simon Huntff663742015-05-14 13:33:05 -070069
tomdb0d03f2014-08-27 16:34:15 -070070/**
71 * Provides basic implementation of the host SB & NB APIs.
72 */
73@Component(immediate = true)
74@Service
tom202175a2014-09-19 19:00:11 -070075public class HostManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070076 extends AbstractListenerProviderRegistry<HostEvent, HostListener, HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070077 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070078
tom5f38b3a2014-08-27 23:50:54 -070079 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070080
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070081 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070082
Sahil Lele3a0cdd52015-07-21 14:16:31 -070083 private final NetworkConfigListener networkConfigListener = new InternalNetworkConfigListener();
84
tomc78acee2014-09-24 15:16:55 -070085 private HostStoreDelegate delegate = new InternalStoreDelegate();
86
tom5bcc9462014-09-19 10:11:31 -070087 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
88 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070089
tom5f38b3a2014-08-27 23:50:54 -070090 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart70da5122014-10-01 16:37:42 -070091 protected DeviceService deviceService;
92
93 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
94 protected PacketService packetService;
95
Sahil Lele3a0cdd52015-07-21 14:16:31 -070096 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
97 protected NetworkConfigService networkConfigService;
98
Jonathan Hart4cb39882015-08-12 23:50:55 -040099 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
100 protected InterfaceService interfaceService;
101
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200102 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
103 protected EdgePortService edgePortService;
104
soumya3e6f05e2016-08-05 15:11:11 -0700105 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
106 protected ComponentConfigService cfgService;
107
108 @Property(name = "allowDuplicateIps", boolValue = true,
109 label = "Enable removal of duplicate ip address")
soumya3e6f05e2016-08-05 15:11:11 -0700110 private boolean allowDuplicateIps = true;
sdn94b00152016-08-30 02:12:32 -0700111
112 @Property(name = "monitorHosts", boolValue = false,
113 label = "Enable/Disable monitoring of hosts")
114 private boolean monitorHosts = false;
115
116 @Property(name = "probeRate", longValue = 30000,
117 label = "Set the probe Rate in milli seconds")
118 private long probeRate = 30000;
119
Pier Luigi9b1d6262017-02-02 22:31:34 -0800120 @Property(name = "greedyLearningIpv6", boolValue = false,
121 label = "Enable/Disable greedy learning of IPv6 link local address")
122 private boolean greedyLearningIpv6 = false;
123
Jonathan Hart70da5122014-10-01 16:37:42 -0700124 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -0700125
soumya3e6f05e2016-08-05 15:11:11 -0700126
tomdb0d03f2014-08-27 16:34:15 -0700127 @Activate
soumya3e6f05e2016-08-05 15:11:11 -0700128 public void activate(ComponentContext context) {
tomc78acee2014-09-24 15:16:55 -0700129 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -0700130 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
soumya3e6f05e2016-08-05 15:11:11 -0700131 cfgService.registerProperties(getClass());
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700132 networkConfigService.addListener(networkConfigListener);
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200133 monitor = new HostMonitor(packetService, this, interfaceService, edgePortService);
sdn94b00152016-08-30 02:12:32 -0700134 monitor.setProbeRate(probeRate);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -0700135 monitor.start();
sdn94b00152016-08-30 02:12:32 -0700136 modified(context);
137 cfgService.registerProperties(getClass());
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700138 log.info("Started");
tomdb0d03f2014-08-27 16:34:15 -0700139 }
140
sdn94b00152016-08-30 02:12:32 -0700141 @Deactivate
142 public void deactivate() {
143 store.unsetDelegate(delegate);
144 eventDispatcher.removeSink(HostEvent.class);
145 networkConfigService.removeListener(networkConfigListener);
146 cfgService.unregisterProperties(getClass(), false);
147 monitor.shutdown();
148 log.info("Stopped");
149 }
150
soumya3e6f05e2016-08-05 15:11:11 -0700151 @Modified
sdn94b00152016-08-30 02:12:32 -0700152 public void modified(ComponentContext context) {
153 boolean oldValue = monitorHosts;
154 readComponentConfiguration(context);
155 if (probeRate > 0) {
156 monitor.setProbeRate(probeRate);
157 } else {
158 log.warn("probeRate cannot be lessthan 0");
159 }
160
161 if (oldValue != monitorHosts) {
162 if (monitorHosts) {
163 startMonitoring();
164 } else {
165 stopMonitoring();
166 }
167 }
168 }
169
170 /**
171 * Extracts properties from the component configuration context.
172 *
173 * @param context the component context
174 */
175 private void readComponentConfiguration(ComponentContext context) {
soumya3e6f05e2016-08-05 15:11:11 -0700176 Dictionary<?, ?> properties = context.getProperties();
177 Boolean flag;
sdn94b00152016-08-30 02:12:32 -0700178
179 flag = Tools.isPropertyEnabled(properties, "monitorHosts");
180 if (flag == null) {
181 log.info("monitorHosts is not enabled " +
182 "using current value of {}", monitorHosts);
183 } else {
184 monitorHosts = flag;
185 log.info("Configured. monitorHosts {}",
186 monitorHosts ? "enabled" : "disabled");
187 }
188
189 Long longValue = Tools.getLongProperty(properties, "probeRate");
190 if (longValue == null || longValue == 0) {
191 log.info("probeRate is not set sing default value of {}", probeRate);
192 } else {
193 probeRate = longValue;
194 log.info("Configured. probeRate {}", probeRate);
195 }
196
soumya3e6f05e2016-08-05 15:11:11 -0700197 flag = Tools.isPropertyEnabled(properties, "allowDuplicateIps");
198 if (flag == null) {
199 log.info("Removal of duplicate ip address is not configured");
200 } else {
201 allowDuplicateIps = flag;
202 log.info("Removal of duplicate ip address is {}",
203 allowDuplicateIps ? "disabled" : "enabled");
204 }
sdn94b00152016-08-30 02:12:32 -0700205
Pier Luigi9b1d6262017-02-02 22:31:34 -0800206 flag = Tools.isPropertyEnabled(properties, "greedyLearningIpv6");
207 if (flag == null) {
208 log.info("greedy learning is not enabled " +
209 "using current value of {}", greedyLearningIpv6);
210 } else {
211 greedyLearningIpv6 = flag;
212 log.info("Configured. greedyLearningIpv6 {}",
213 greedyLearningIpv6 ? "enabled" : "disabled");
214 }
215
soumya3e6f05e2016-08-05 15:11:11 -0700216 }
217
sdn94b00152016-08-30 02:12:32 -0700218 /**
219 * Starts monitoring the hosts by IP Address.
220 *
221 */
222 private void startMonitoring() {
223 store.getHosts().forEach(host -> {
224 host.ipAddresses().forEach(ip -> {
225 monitor.addMonitoringFor(ip);
226 });
227 });
228 }
229
230 /**
231 * Stops monitoring the hosts by IP Address.
232 *
233 */
234 private void stopMonitoring() {
235 store.getHosts().forEach(host -> {
236 host.ipAddresses().forEach(ip -> {
237 monitor.stopMonitoring(ip);
238 });
239 });
tomdb0d03f2014-08-27 16:34:15 -0700240 }
241
242 @Override
tom5f38b3a2014-08-27 23:50:54 -0700243 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700244 monitor.registerHostProvider(provider);
tom5f38b3a2014-08-27 23:50:54 -0700245 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -0700246 }
247
tom7869ad92014-09-09 14:32:08 -0700248 @Override
249 public int getHostCount() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900250 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700251 return store.getHostCount();
252 }
253
254 @Override
255 public Iterable<Host> getHosts() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900256 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700257 return store.getHosts();
258 }
259
260 @Override
261 public Host getHost(HostId hostId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900262 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700263 checkNotNull(hostId, HOST_ID_NULL);
264 return store.getHost(hostId);
265 }
266
267 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700268 public Set<Host> getHostsByVlan(VlanId vlanId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900269 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700270 return store.getHosts(vlanId);
271 }
272
273 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700274 public Set<Host> getHostsByMac(MacAddress mac) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900275 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700276 checkNotNull(mac, "MAC address cannot be null");
277 return store.getHosts(mac);
278 }
279
280 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700281 public Set<Host> getHostsByIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900282 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700283 checkNotNull(ip, "IP address cannot be null");
284 return store.getHosts(ip);
285 }
286
287 @Override
288 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900289 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700290 checkNotNull(connectPoint, "Connection point cannot be null");
291 return store.getConnectedHosts(connectPoint);
292 }
293
294 @Override
295 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900296 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700297 checkNotNull(deviceId, "Device ID cannot be null");
298 return store.getConnectedHosts(deviceId);
299 }
300
301 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700302 public void startMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900303 checkPermission(HOST_EVENT);
Jonathan Hart70da5122014-10-01 16:37:42 -0700304 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700305 }
306
307 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700308 public void stopMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900309 checkPermission(HOST_EVENT);
Jonathan Hart70da5122014-10-01 16:37:42 -0700310 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700311 }
312
313 @Override
314 public void requestMac(IpAddress ip) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700315 // FIXME!!!! Auto-generated method stub
tom7869ad92014-09-09 14:32:08 -0700316 }
317
tom89b63c52014-09-16 09:19:51 -0700318 @Override
319 public void removeHost(HostId hostId) {
320 checkNotNull(hostId, HOST_ID_NULL);
Charles Chan009c3082015-11-10 14:18:04 -0800321 store.removeHost(hostId);
tom89b63c52014-09-16 09:19:51 -0700322 }
323
tomdb0d03f2014-08-27 16:34:15 -0700324 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700325 private class InternalHostProviderService
326 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700327 implements HostProviderService {
tomcfde0622014-09-09 11:02:42 -0700328 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700329 super(provider);
330 }
331
332 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700333 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
tom7869ad92014-09-09 14:32:08 -0700334 checkNotNull(hostId, HOST_ID_NULL);
335 checkValidity();
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700336 hostDescription = validateHost(hostDescription, hostId);
soumya3e6f05e2016-08-05 15:11:11 -0700337
338 if (!allowDuplicateIps) {
339 removeDuplicates(hostId, hostDescription);
340 }
Charles Chan009c3082015-11-10 14:18:04 -0800341 store.createOrUpdateHost(provider().id(), hostId,
soumya3e6f05e2016-08-05 15:11:11 -0700342 hostDescription, replaceIps);
sdn94b00152016-08-30 02:12:32 -0700343
344 if (monitorHosts) {
345 hostDescription.ipAddress().forEach(ip -> {
346 monitor.addMonitoringFor(ip);
347 });
348 }
Pier Luigi9b1d6262017-02-02 22:31:34 -0800349
350 // Greedy learning of IPv6 host. We have to disable the greedy
351 // learning of configured hosts. Validate hosts each time will
352 // overwrite the learnt information with the configured informations.
353 if (greedyLearningIpv6) {
354 // Auto-generation of the IPv6 link local address
355 // using the mac address
356 Ip6Address targetIp6Address = Ip6Address.valueOf(
357 getLinkLocalAddress(hostId.mac().toBytes())
358 );
359 // If we already know this guy we don't need to do other
360 if (!hostDescription.ipAddress().contains(targetIp6Address)) {
361 Host host = store.getHost(hostId);
362 // Configured host, skip it.
363 if (host != null && host.configured()) {
364 return;
365 }
366 // Host does not exist in the store or the target is not known
367 if ((host == null || !host.ipAddresses().contains(targetIp6Address))) {
368 // We generate ONOS ip from the ONOS default mac
369 // We could use the mac generated for the link
370 // discovery but maybe does not worth
371 MacAddress onosMacAddress = MacAddress.valueOf(DEFAULT_MAC);
372 Ip6Address onosIp6Address = Ip6Address.valueOf(
373 getLinkLocalAddress(onosMacAddress.toBytes())
374 );
375 // We send a probe using the monitoring service
376 monitor.sendProbe(
377 hostDescription.location(),
378 targetIp6Address,
379 onosIp6Address,
380 onosMacAddress,
381 hostId.vlanId()
382 );
383 }
384 }
385 }
tomdb0d03f2014-08-27 16:34:15 -0700386 }
387
soumya3e6f05e2016-08-05 15:11:11 -0700388 // When a new IP is detected, remove that IP on other hosts if it exists
389 public void removeDuplicates(HostId hostId, HostDescription desc) {
390 desc.ipAddress().forEach(ip -> {
391 Set<Host> allHosts = store.getHosts(ip);
392 allHosts.forEach(eachHost -> {
393 if (!(eachHost.id().equals(hostId))) {
394 log.info("Duplicate ip {} found on host {} and {}", ip,
395 hostId.toString(), eachHost.id().toString());
396 store.removeIp(eachHost.id(), ip);
397 }
398 });
399 });
Jonathan Hart38feb6e2016-08-29 22:54:16 +0000400 }
401
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700402 // returns a HostDescription made from the union of the BasicHostConfig
403 // annotations if it exists
404 private HostDescription validateHost(HostDescription hostDescription, HostId hostId) {
405 BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
406 checkState(cfg == null || cfg.isAllowed(), "Host {} is not allowed", hostId);
Ayaka Koshibe5373e762015-08-06 12:31:44 -0700407
408 return BasicHostOperator.combine(cfg, hostDescription);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700409 }
410
tomdb0d03f2014-08-27 16:34:15 -0700411 @Override
tom7869ad92014-09-09 14:32:08 -0700412 public void hostVanished(HostId hostId) {
413 checkNotNull(hostId, HOST_ID_NULL);
414 checkValidity();
sdn94b00152016-08-30 02:12:32 -0700415 Host host = store.getHost(hostId);
Charles Chan29ecdee2017-02-22 18:46:56 -0800416
417 // Disallow removing inexistent host or host provided by others
418 if (host == null || !host.providerId().equals(provider().id())) {
419 return;
420 }
421
sdn94b00152016-08-30 02:12:32 -0700422 if (monitorHosts) {
423 host.ipAddresses().forEach(ip -> {
424 monitor.stopMonitoring(ip);
425 });
426 }
Charles Chan009c3082015-11-10 14:18:04 -0800427 store.removeHost(hostId);
tomdb0d03f2014-08-27 16:34:15 -0700428 }
samanwita palc40e5ed2015-09-24 11:01:51 -0700429
430 @Override
431 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
432 checkNotNull(hostId, HOST_ID_NULL);
433 checkValidity();
Charles Chan009c3082015-11-10 14:18:04 -0800434 store.removeIp(hostId, ipAddress);
samanwita palc40e5ed2015-09-24 11:01:51 -0700435 }
tomdb0d03f2014-08-27 16:34:15 -0700436 }
tom7869ad92014-09-09 14:32:08 -0700437
tomc78acee2014-09-24 15:16:55 -0700438 // Store delegate to re-post events emitted from the store.
439 private class InternalStoreDelegate implements HostStoreDelegate {
440 @Override
441 public void notify(HostEvent event) {
442 post(event);
443 }
444 }
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700445
446 // listens for NetworkConfigEvents of type BasicHostConfig and removes
447 // links that the config does not allow
448 private class InternalNetworkConfigListener implements NetworkConfigListener {
449 @Override
450 public void event(NetworkConfigEvent event) {
451 if ((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
452 event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) &&
453 event.configClass().equals(BasicHostConfig.class)) {
Thomas Vachuska138de8b2016-01-11 21:31:38 -0800454 log.debug("Detected host network config event {}", event.type());
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700455 kickOutBadHost(((HostId) event.subject()));
456 }
457 }
458 }
459
460 // checks if the specified host is allowed by the BasicHostConfig
461 // and if not, removes it
462 private void kickOutBadHost(HostId hostId) {
463 BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
464 if (cfg != null && !cfg.isAllowed()) {
465 Host badHost = getHost(hostId);
466 if (badHost != null) {
467 removeHost(hostId);
468 } else {
469 log.info("Failed removal: Host {} does not exist", hostId);
470 }
471 }
472 }
tomdb0d03f2014-08-27 16:34:15 -0700473}