MRI version bumpup for Aluminium
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / intervpnlink / InterVpnLinkStateListener.java
1 /*
2  * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.netvirt.vpnmanager.intervpnlink;
9
10 import java.util.Optional;
11 import javax.annotation.PreDestroy;
12 import javax.inject.Inject;
13 import javax.inject.Singleton;
14 import org.opendaylight.infrautils.utils.concurrent.Executors;
15 import org.opendaylight.mdsal.binding.api.DataBroker;
16 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
17 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.IVpnLinkService;
18 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
19 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
20 import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 /**
28  * Class responsible for listening to changes in the State of an InterVpnLink,
29  * specially for when the InterVpnLink becomes active.
30  */
31 @Singleton
32 public class InterVpnLinkStateListener extends AbstractAsyncDataTreeChangeListener<InterVpnLinkState> {
33
34     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkStateListener.class);
35
36     private final DataBroker dataBroker;
37     private final IVpnLinkService ivpnLinkService;
38     private final InterVpnLinkCache interVpnLinkCache;
39
40     @Inject
41     public InterVpnLinkStateListener(final DataBroker dataBroker, final IVpnLinkService interVpnLinkService,
42             final InterVpnLinkCache interVpnLinkCache) {
43         super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinkStates.class)
44                 .child(InterVpnLinkState.class),
45                 Executors.newListeningSingleThreadExecutor("InterVpnLinkStateListener", LOG));
46         this.dataBroker = dataBroker;
47         this.ivpnLinkService = interVpnLinkService;
48         this.interVpnLinkCache = interVpnLinkCache;
49     }
50
51     public void start() {
52         LOG.info("{} start", getClass().getSimpleName());
53     }
54
55     @Override
56     @PreDestroy
57     public void close() {
58         super.close();
59         Executors.shutdownAndAwaitTermination(getExecutorService());
60     }
61
62     @Override
63     public void remove(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
64     }
65
66     @Override
67     public void update(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState before,
68                           InterVpnLinkState after) {
69         if (before.getState() == InterVpnLinkState.State.Error && after.getState() == InterVpnLinkState.State.Active) {
70             Optional<InterVpnLinkDataComposite> optIVpnLink =
71                     interVpnLinkCache.getInterVpnLinkByName(after.getInterVpnLinkName());
72
73             if (!optIVpnLink.isPresent()) {
74                 LOG.warn("InterVpnLink became ACTIVE, but could not found its info in Cache");
75                 interVpnLinkCache.addInterVpnLinkStateToCaches(after);
76                 optIVpnLink = interVpnLinkCache.getInterVpnLinkByName(after.getInterVpnLinkName());
77             }
78             ivpnLinkService.handleStaticRoutes(optIVpnLink.get());
79         }
80     }
81
82
83     @Override
84     public void add(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
85     }
86 }