Merge "OPNFLWPLUG-929 : Remove deprecated guava library in openflowplugin-impl"
[openflowplugin.git] / applications / topology-lldp-discovery / src / main / java / org / opendaylight / openflowplugin / applications / topology / lldp / LLDPLinkAger.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowplugin.applications.topology.lldp;
9
10 import com.google.common.annotations.VisibleForTesting;
11 import java.util.Date;
12 import java.util.Map;
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;
27
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;
35
36     /**
37      * default ctor - start timer
38      */
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<>();
46         timer = new Timer();
47         timer.schedule(new LLDPAgingTask(), 0, topologyLldpDiscoveryConfig.getTopologyLldpInterval().getValue());
48     }
49
50     public void put(LinkDiscovered link) {
51         Date expires = new Date();
52         expires.setTime(expires.getTime() + linkExpirationTime);
53         linkToDate.put(link, expires);
54     }
55
56     @Override
57     public void close() throws Exception {
58         timer.cancel();
59         linkToDate.clear();
60         configurationServiceRegistration.close();
61     }
62
63     private class LLDPAgingTask extends TimerTask {
64
65         @Override
66         public void run() {
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);
76                     }
77                 }
78             }
79
80         }
81
82     }
83
84     @VisibleForTesting
85     public boolean isLinkToDateEmpty() {
86         return linkToDate.isEmpty();
87     }
88
89     @Override
90     public void onPropertyChanged(@Nonnull final String propertyName, @Nonnull final String propertyValue) {
91         Optional.ofNullable(TopologyLLDPDiscoveryProperty.forValue(propertyName)).ifPresent(lldpDiscoveryProperty -> {
92             switch (lldpDiscoveryProperty) {
93                 case LLDP_SECURE_KEY:
94                     LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
95                     break;
96                 case TOPOLOGY_LLDP_INTERVAL:
97                     LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
98                     break;
99                 case TOPOLOGY_LLDP_EXPIRATION_INTERVAL:
100                     LOG.warn("Runtime update not supported for property {}", lldpDiscoveryProperty);
101                     break;
102                 default:
103                     LOG.warn("No topology lldp discovery property found.");
104                     break;
105             }
106         });
107     }
108 }