blob: 06f3120274b0cb9f80aa024f867ff153e3ab2d4c [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;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.ConnectPoint;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.Host;
36import org.onosproject.net.HostId;
Simon Huntffbad3b2017-05-16 15:37:51 -070037import org.onosproject.net.config.NetworkConfigEvent;
38import org.onosproject.net.config.NetworkConfigListener;
39import org.onosproject.net.config.NetworkConfigService;
40import org.onosproject.net.config.basics.BasicHostConfig;
Brian O'Connorabafb502014-12-02 22:26:20 -080041import org.onosproject.net.device.DeviceService;
Simon Huntffbad3b2017-05-16 15:37:51 -070042import org.onosproject.net.edge.EdgePortService;
Brian O'Connorabafb502014-12-02 22:26:20 -080043import org.onosproject.net.host.HostAdminService;
44import org.onosproject.net.host.HostDescription;
45import org.onosproject.net.host.HostEvent;
46import org.onosproject.net.host.HostListener;
47import org.onosproject.net.host.HostProvider;
48import org.onosproject.net.host.HostProviderRegistry;
49import org.onosproject.net.host.HostProviderService;
50import org.onosproject.net.host.HostService;
51import org.onosproject.net.host.HostStore;
52import org.onosproject.net.host.HostStoreDelegate;
Brian O'Connorabafb502014-12-02 22:26:20 -080053import org.onosproject.net.packet.PacketService;
Simon Huntffbad3b2017-05-16 15:37:51 -070054import org.onosproject.net.provider.AbstractListenerProviderRegistry;
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;
Simon Huntffbad3b2017-05-16 15:37:51 -070067import static org.onosproject.security.AppPermission.Type.HOST_EVENT;
68import static org.onosproject.security.AppPermission.Type.HOST_READ;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070069import static org.slf4j.LoggerFactory.getLogger;
Simon Huntff663742015-05-14 13:33:05 -070070
tomdb0d03f2014-08-27 16:34:15 -070071/**
72 * Provides basic implementation of the host SB & NB APIs.
73 */
74@Component(immediate = true)
75@Service
tom202175a2014-09-19 19:00:11 -070076public class HostManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070077 extends AbstractListenerProviderRegistry<HostEvent, HostListener, HostProvider, HostProviderService>
tom89b63c52014-09-16 09:19:51 -070078 implements HostService, HostAdminService, HostProviderRegistry {
tomdb0d03f2014-08-27 16:34:15 -070079
tom5f38b3a2014-08-27 23:50:54 -070080 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070081
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070082 public static final String HOST_ID_NULL = "Host ID cannot be null";
tom5f38b3a2014-08-27 23:50:54 -070083
Sahil Lele3a0cdd52015-07-21 14:16:31 -070084 private final NetworkConfigListener networkConfigListener = new InternalNetworkConfigListener();
85
tomc78acee2014-09-24 15:16:55 -070086 private HostStoreDelegate delegate = new InternalStoreDelegate();
87
tom5bcc9462014-09-19 10:11:31 -070088 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 protected HostStore store;
tom7869ad92014-09-09 14:32:08 -070090
tom5f38b3a2014-08-27 23:50:54 -070091 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart70da5122014-10-01 16:37:42 -070092 protected DeviceService deviceService;
93
94 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
95 protected PacketService packetService;
96
Sahil Lele3a0cdd52015-07-21 14:16:31 -070097 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
98 protected NetworkConfigService networkConfigService;
99
Jonathan Hart4cb39882015-08-12 23:50:55 -0400100 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
101 protected InterfaceService interfaceService;
102
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200103 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
104 protected EdgePortService edgePortService;
105
soumya3e6f05e2016-08-05 15:11:11 -0700106 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
107 protected ComponentConfigService cfgService;
108
109 @Property(name = "allowDuplicateIps", boolValue = true,
110 label = "Enable removal of duplicate ip address")
soumya3e6f05e2016-08-05 15:11:11 -0700111 private boolean allowDuplicateIps = true;
sdn94b00152016-08-30 02:12:32 -0700112
113 @Property(name = "monitorHosts", boolValue = false,
114 label = "Enable/Disable monitoring of hosts")
115 private boolean monitorHosts = false;
116
117 @Property(name = "probeRate", longValue = 30000,
118 label = "Set the probe Rate in milli seconds")
119 private long probeRate = 30000;
120
Pier Luigi9b1d6262017-02-02 22:31:34 -0800121 @Property(name = "greedyLearningIpv6", boolValue = false,
122 label = "Enable/Disable greedy learning of IPv6 link local address")
123 private boolean greedyLearningIpv6 = false;
124
Jonathan Hart70da5122014-10-01 16:37:42 -0700125 private HostMonitor monitor;
tomdb0d03f2014-08-27 16:34:15 -0700126
soumya3e6f05e2016-08-05 15:11:11 -0700127
tomdb0d03f2014-08-27 16:34:15 -0700128 @Activate
soumya3e6f05e2016-08-05 15:11:11 -0700129 public void activate(ComponentContext context) {
tomc78acee2014-09-24 15:16:55 -0700130 store.setDelegate(delegate);
tom96dfcab2014-08-28 09:26:03 -0700131 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
soumya3e6f05e2016-08-05 15:11:11 -0700132 cfgService.registerProperties(getClass());
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700133 networkConfigService.addListener(networkConfigListener);
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200134 monitor = new HostMonitor(packetService, this, interfaceService, edgePortService);
sdn94b00152016-08-30 02:12:32 -0700135 monitor.setProbeRate(probeRate);
Jonathan Hart8f6f1ea2014-10-03 16:05:19 -0700136 monitor.start();
sdn94b00152016-08-30 02:12:32 -0700137 modified(context);
138 cfgService.registerProperties(getClass());
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700139 log.info("Started");
tomdb0d03f2014-08-27 16:34:15 -0700140 }
141
sdn94b00152016-08-30 02:12:32 -0700142 @Deactivate
143 public void deactivate() {
144 store.unsetDelegate(delegate);
145 eventDispatcher.removeSink(HostEvent.class);
146 networkConfigService.removeListener(networkConfigListener);
147 cfgService.unregisterProperties(getClass(), false);
148 monitor.shutdown();
149 log.info("Stopped");
150 }
151
soumya3e6f05e2016-08-05 15:11:11 -0700152 @Modified
Simon Huntffbad3b2017-05-16 15:37:51 -0700153 public void modified(ComponentContext context) {
sdn94b00152016-08-30 02:12:32 -0700154 boolean oldValue = monitorHosts;
155 readComponentConfiguration(context);
156 if (probeRate > 0) {
157 monitor.setProbeRate(probeRate);
158 } else {
159 log.warn("probeRate cannot be lessthan 0");
160 }
161
162 if (oldValue != monitorHosts) {
163 if (monitorHosts) {
164 startMonitoring();
165 } else {
166 stopMonitoring();
167 }
168 }
169 }
170
171 /**
172 * Extracts properties from the component configuration context.
173 *
174 * @param context the component context
175 */
176 private void readComponentConfiguration(ComponentContext context) {
soumya3e6f05e2016-08-05 15:11:11 -0700177 Dictionary<?, ?> properties = context.getProperties();
178 Boolean flag;
sdn94b00152016-08-30 02:12:32 -0700179
180 flag = Tools.isPropertyEnabled(properties, "monitorHosts");
181 if (flag == null) {
182 log.info("monitorHosts is not enabled " +
183 "using current value of {}", monitorHosts);
184 } else {
185 monitorHosts = flag;
186 log.info("Configured. monitorHosts {}",
Simon Huntffbad3b2017-05-16 15:37:51 -0700187 monitorHosts ? "enabled" : "disabled");
sdn94b00152016-08-30 02:12:32 -0700188 }
189
190 Long longValue = Tools.getLongProperty(properties, "probeRate");
191 if (longValue == null || longValue == 0) {
192 log.info("probeRate is not set sing default value of {}", probeRate);
193 } else {
194 probeRate = longValue;
195 log.info("Configured. probeRate {}", probeRate);
196 }
197
soumya3e6f05e2016-08-05 15:11:11 -0700198 flag = Tools.isPropertyEnabled(properties, "allowDuplicateIps");
199 if (flag == null) {
200 log.info("Removal of duplicate ip address is not configured");
201 } else {
202 allowDuplicateIps = flag;
203 log.info("Removal of duplicate ip address is {}",
204 allowDuplicateIps ? "disabled" : "enabled");
205 }
sdn94b00152016-08-30 02:12:32 -0700206
Pier Luigi9b1d6262017-02-02 22:31:34 -0800207 flag = Tools.isPropertyEnabled(properties, "greedyLearningIpv6");
208 if (flag == null) {
209 log.info("greedy learning is not enabled " +
210 "using current value of {}", greedyLearningIpv6);
211 } else {
212 greedyLearningIpv6 = flag;
213 log.info("Configured. greedyLearningIpv6 {}",
214 greedyLearningIpv6 ? "enabled" : "disabled");
215 }
216
soumya3e6f05e2016-08-05 15:11:11 -0700217 }
218
sdn94b00152016-08-30 02:12:32 -0700219 /**
220 * Starts monitoring the hosts by IP Address.
sdn94b00152016-08-30 02:12:32 -0700221 */
222 private void startMonitoring() {
223 store.getHosts().forEach(host -> {
Simon Huntffbad3b2017-05-16 15:37:51 -0700224 host.ipAddresses().forEach(ip -> {
225 monitor.addMonitoringFor(ip);
sdn94b00152016-08-30 02:12:32 -0700226 });
227 });
228 }
229
230 /**
231 * Stops monitoring the hosts by IP Address.
sdn94b00152016-08-30 02:12:32 -0700232 */
233 private void stopMonitoring() {
234 store.getHosts().forEach(host -> {
Simon Huntffbad3b2017-05-16 15:37:51 -0700235 host.ipAddresses().forEach(ip -> {
236 monitor.stopMonitoring(ip);
sdn94b00152016-08-30 02:12:32 -0700237 });
238 });
tomdb0d03f2014-08-27 16:34:15 -0700239 }
240
241 @Override
tom5f38b3a2014-08-27 23:50:54 -0700242 protected HostProviderService createProviderService(HostProvider provider) {
Jonathan Hart70da5122014-10-01 16:37:42 -0700243 monitor.registerHostProvider(provider);
tom5f38b3a2014-08-27 23:50:54 -0700244 return new InternalHostProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -0700245 }
246
tom7869ad92014-09-09 14:32:08 -0700247 @Override
248 public int getHostCount() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900249 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700250 return store.getHostCount();
251 }
252
253 @Override
254 public Iterable<Host> getHosts() {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900255 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700256 return store.getHosts();
257 }
258
259 @Override
260 public Host getHost(HostId hostId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900261 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700262 checkNotNull(hostId, HOST_ID_NULL);
263 return store.getHost(hostId);
264 }
265
266 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700267 public Set<Host> getHostsByVlan(VlanId vlanId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900268 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700269 return store.getHosts(vlanId);
270 }
271
272 @Override
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700273 public Set<Host> getHostsByMac(MacAddress mac) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900274 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700275 checkNotNull(mac, "MAC address cannot be null");
276 return store.getHosts(mac);
277 }
278
279 @Override
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700280 public Set<Host> getHostsByIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900281 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700282 checkNotNull(ip, "IP address cannot be null");
283 return store.getHosts(ip);
284 }
285
286 @Override
287 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900288 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700289 checkNotNull(connectPoint, "Connection point cannot be null");
290 return store.getConnectedHosts(connectPoint);
291 }
292
293 @Override
294 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900295 checkPermission(HOST_READ);
tom7869ad92014-09-09 14:32:08 -0700296 checkNotNull(deviceId, "Device ID cannot be null");
297 return store.getConnectedHosts(deviceId);
298 }
299
300 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700301 public void startMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900302 checkPermission(HOST_EVENT);
Jonathan Hart70da5122014-10-01 16:37:42 -0700303 monitor.addMonitoringFor(ip);
Jonathan Hartfca736c2014-09-19 17:26:59 -0700304 }
305
306 @Override
Jonathan Hartac60c082014-09-23 08:55:17 -0700307 public void stopMonitoringIp(IpAddress ip) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900308 checkPermission(HOST_EVENT);
Jonathan Hart70da5122014-10-01 16:37:42 -0700309 monitor.stopMonitoring(ip);
Jonathan Hartac60c082014-09-23 08:55:17 -0700310 }
311
312 @Override
313 public void requestMac(IpAddress ip) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700314 // FIXME!!!! Auto-generated method stub
tom7869ad92014-09-09 14:32:08 -0700315 }
316
tom89b63c52014-09-16 09:19:51 -0700317 @Override
318 public void removeHost(HostId hostId) {
319 checkNotNull(hostId, HOST_ID_NULL);
Charles Chan009c3082015-11-10 14:18:04 -0800320 store.removeHost(hostId);
tom89b63c52014-09-16 09:19:51 -0700321 }
322
tomdb0d03f2014-08-27 16:34:15 -0700323 // Personalized host provider service issued to the supplied provider.
tom7869ad92014-09-09 14:32:08 -0700324 private class InternalHostProviderService
325 extends AbstractProviderService<HostProvider>
tomdb0d03f2014-08-27 16:34:15 -0700326 implements HostProviderService {
tomcfde0622014-09-09 11:02:42 -0700327 InternalHostProviderService(HostProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700328 super(provider);
329 }
330
331 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700332 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
tom7869ad92014-09-09 14:32:08 -0700333 checkNotNull(hostId, HOST_ID_NULL);
334 checkValidity();
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700335 hostDescription = validateHost(hostDescription, hostId);
soumya3e6f05e2016-08-05 15:11:11 -0700336
337 if (!allowDuplicateIps) {
338 removeDuplicates(hostId, hostDescription);
339 }
Charles Chan009c3082015-11-10 14:18:04 -0800340 store.createOrUpdateHost(provider().id(), hostId,
soumya3e6f05e2016-08-05 15:11:11 -0700341 hostDescription, replaceIps);
sdn94b00152016-08-30 02:12:32 -0700342
343 if (monitorHosts) {
344 hostDescription.ipAddress().forEach(ip -> {
345 monitor.addMonitoringFor(ip);
346 });
347 }
Pier Luigi9b1d6262017-02-02 22:31:34 -0800348
349 // Greedy learning of IPv6 host. We have to disable the greedy
350 // learning of configured hosts. Validate hosts each time will
351 // overwrite the learnt information with the configured informations.
352 if (greedyLearningIpv6) {
353 // Auto-generation of the IPv6 link local address
354 // using the mac address
355 Ip6Address targetIp6Address = Ip6Address.valueOf(
356 getLinkLocalAddress(hostId.mac().toBytes())
357 );
358 // If we already know this guy we don't need to do other
359 if (!hostDescription.ipAddress().contains(targetIp6Address)) {
360 Host host = store.getHost(hostId);
361 // Configured host, skip it.
362 if (host != null && host.configured()) {
363 return;
364 }
365 // Host does not exist in the store or the target is not known
366 if ((host == null || !host.ipAddresses().contains(targetIp6Address))) {
367 // We generate ONOS ip from the ONOS default mac
368 // We could use the mac generated for the link
369 // discovery but maybe does not worth
370 MacAddress onosMacAddress = MacAddress.valueOf(DEFAULT_MAC);
371 Ip6Address onosIp6Address = Ip6Address.valueOf(
372 getLinkLocalAddress(onosMacAddress.toBytes())
373 );
374 // We send a probe using the monitoring service
375 monitor.sendProbe(
376 hostDescription.location(),
377 targetIp6Address,
378 onosIp6Address,
379 onosMacAddress,
380 hostId.vlanId()
381 );
382 }
383 }
384 }
tomdb0d03f2014-08-27 16:34:15 -0700385 }
386
soumya3e6f05e2016-08-05 15:11:11 -0700387 // When a new IP is detected, remove that IP on other hosts if it exists
388 public void removeDuplicates(HostId hostId, HostDescription desc) {
389 desc.ipAddress().forEach(ip -> {
390 Set<Host> allHosts = store.getHosts(ip);
391 allHosts.forEach(eachHost -> {
392 if (!(eachHost.id().equals(hostId))) {
393 log.info("Duplicate ip {} found on host {} and {}", ip,
394 hostId.toString(), eachHost.id().toString());
395 store.removeIp(eachHost.id(), ip);
396 }
397 });
398 });
Jonathan Hart38feb6e2016-08-29 22:54:16 +0000399 }
400
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700401 // returns a HostDescription made from the union of the BasicHostConfig
402 // annotations if it exists
403 private HostDescription validateHost(HostDescription hostDescription, HostId hostId) {
404 BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
405 checkState(cfg == null || cfg.isAllowed(), "Host {} is not allowed", hostId);
Ayaka Koshibe5373e762015-08-06 12:31:44 -0700406
407 return BasicHostOperator.combine(cfg, hostDescription);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700408 }
409
tomdb0d03f2014-08-27 16:34:15 -0700410 @Override
tom7869ad92014-09-09 14:32:08 -0700411 public void hostVanished(HostId hostId) {
412 checkNotNull(hostId, HOST_ID_NULL);
413 checkValidity();
sdn94b00152016-08-30 02:12:32 -0700414 Host host = store.getHost(hostId);
Charles Chan29ecdee2017-02-22 18:46:56 -0800415
416 // Disallow removing inexistent host or host provided by others
417 if (host == null || !host.providerId().equals(provider().id())) {
418 return;
419 }
420
sdn94b00152016-08-30 02:12:32 -0700421 if (monitorHosts) {
422 host.ipAddresses().forEach(ip -> {
423 monitor.stopMonitoring(ip);
424 });
425 }
Charles Chan009c3082015-11-10 14:18:04 -0800426 store.removeHost(hostId);
tomdb0d03f2014-08-27 16:34:15 -0700427 }
samanwita palc40e5ed2015-09-24 11:01:51 -0700428
429 @Override
430 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
431 checkNotNull(hostId, HOST_ID_NULL);
432 checkValidity();
Charles Chan009c3082015-11-10 14:18:04 -0800433 store.removeIp(hostId, ipAddress);
samanwita palc40e5ed2015-09-24 11:01:51 -0700434 }
tomdb0d03f2014-08-27 16:34:15 -0700435 }
tom7869ad92014-09-09 14:32:08 -0700436
tomc78acee2014-09-24 15:16:55 -0700437 // Store delegate to re-post events emitted from the store.
438 private class InternalStoreDelegate implements HostStoreDelegate {
439 @Override
440 public void notify(HostEvent event) {
441 post(event);
442 }
443 }
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700444
445 // listens for NetworkConfigEvents of type BasicHostConfig and removes
446 // links that the config does not allow
447 private class InternalNetworkConfigListener implements NetworkConfigListener {
448 @Override
Simon Huntffbad3b2017-05-16 15:37:51 -0700449 public boolean isRelevant(NetworkConfigEvent event) {
450 return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED
451 || event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)
452 && (event.configClass().equals(BasicHostConfig.class));
453 }
454
455 @Override
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700456 public void event(NetworkConfigEvent event) {
Simon Huntffbad3b2017-05-16 15:37:51 -0700457 log.debug("Detected host network config event {}", event.type());
458 HostEvent he = null;
459
460 HostId hostId = (HostId) event.subject();
461 BasicHostConfig cfg =
462 networkConfigService.getConfig(hostId, BasicHostConfig.class);
463
464 if (!isAllowed(cfg)) {
465 kickOutBadHost(hostId);
466 } else {
467 Host host = getHost(hostId);
468 HostDescription desc =
469 (host == null) ? null : BasicHostOperator.descriptionOf(host);
470 desc = BasicHostOperator.combine(cfg, desc);
471 if (desc != null) {
472 he = store.createOrUpdateHost(host.providerId(), hostId, desc, false);
473 }
474 }
475
476 if (he != null) {
477 post(he);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700478 }
479 }
480 }
481
Simon Huntffbad3b2017-05-16 15:37:51 -0700482 // by default allowed, otherwise check flag
483 private boolean isAllowed(BasicHostConfig cfg) {
484 return (cfg == null || cfg.isAllowed());
485 }
486
487 // removes the specified host, if it exists
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700488 private void kickOutBadHost(HostId hostId) {
Simon Huntffbad3b2017-05-16 15:37:51 -0700489 Host badHost = getHost(hostId);
490 if (badHost != null) {
491 removeHost(hostId);
Sahil Lele3a0cdd52015-07-21 14:16:31 -0700492 }
493 }
tomdb0d03f2014-08-27 16:34:15 -0700494}