2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.applications.topology.lldp;
10 import com.google.common.annotations.VisibleForTesting;
11 import java.util.Date;
13 import java.util.Map.Entry;
14 import java.util.Optional;
15 import java.util.Timer;
16 import java.util.TimerTask;
17 import java.util.concurrent.ConcurrentHashMap;
18 import javax.annotation.Nonnull;
19 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
20 import org.opendaylight.openflowplugin.api.openflow.configuration.ConfigurationListener;
21 import org.opendaylight.openflowplugin.api.openflow.configuration.ConfigurationService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemovedBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.lldp.discovery.config.rev160511.TopologyLldpDiscoveryConfig;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 public class LLDPLinkAger implements ConfigurationListener, AutoCloseable {
29 private static final Logger LOG = LoggerFactory.getLogger(LLDPLinkAger.class);
30 private final long linkExpirationTime;
31 private final Map<LinkDiscovered, Date> linkToDate;
32 private final Timer timer;
33 private final NotificationProviderService notificationService;
34 private final AutoCloseable configurationServiceRegistration;
37 * default ctor - start timer
39 public LLDPLinkAger(final TopologyLldpDiscoveryConfig topologyLldpDiscoveryConfig,
40 final NotificationProviderService notificationService,
41 final ConfigurationService configurationService) {
42 this.linkExpirationTime = topologyLldpDiscoveryConfig.getTopologyLldpExpirationInterval().getValue();
43 this.notificationService = notificationService;
44 this.configurationServiceRegistration = configurationService.registerListener(this);
45 linkToDate = new ConcurrentHashMap<>();
47 timer.schedule(new LLDPAgingTask(), 0, topologyLldpDiscoveryConfig.getTopologyLldpInterval().getValue());
50 public void put(LinkDiscovered link) {
51 Date expires = new Date();
52 expires.setTime(expires.getTime() + linkExpirationTime);
53 linkToDate.put(link, expires);
57 public void close() throws Exception {
60 configurationServiceRegistration.close();
63 private class LLDPAgingTask extends TimerTask {
67 for (Entry<LinkDiscovered,Date> entry : linkToDate.entrySet()) {
68 LinkDiscovered link = entry.getKey();
69 Date expires = entry.getValue();
70 Date now = new Date();
71 if(now.after(expires)) {
72 if (notificationService != null) {
73 LinkRemovedBuilder lrb = new LinkRemovedBuilder(link);
74 notificationService.publish(lrb.build());
75 linkToDate.remove(link);
85 public boolean isLinkToDateEmpty() {
86 return linkToDate.isEmpty();
90 public void onPropertyChanged(@Nonnull final String propertyName, @Nonnull final String propertyValue) {
91 Optional.ofNullable(TopologyLLDPDiscoveryProperty.forValue(propertyName)).ifPresent(lldpDiscoveryProperty -> {
92 switch (lldpDiscoveryProperty) {
94 LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
96 case TOPOLOGY_LLDP_INTERVAL:
97 LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
99 case TOPOLOGY_LLDP_EXPIRATION_INTERVAL:
100 LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
103 LOG.warn("No topology lldp discovery property found.");