Remove redundant names in paths
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / intervpnlink / InterVpnLinkNodeListener.java
1 /*
2  * Copyright (c) 2016, 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.math.BigInteger;
11 import java.util.List;
12 import javax.annotation.PostConstruct;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
18 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
19 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
20 import org.opendaylight.netvirt.vpnmanager.VpnFootprintService;
21 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
22 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
23 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCleanedCheckerTask;
24 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCreatorTask;
25 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkRemoverTask;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 /**
39  * Listens for Nodes going down, in order to check if the InterVpnLink must be
40  * moved to some other DPN.
41  */
42 @Singleton
43 public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<Node, InterVpnLinkNodeListener> {
44     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeListener.class);
45
46     public static final TopologyId FLOW_TOPOLOGY_ID = new TopologyId(new Uri("flow:1"));
47
48     private final DataBroker dataBroker;
49     private final IMdsalApiManager mdsalManager;
50     private final VpnFootprintService vpnFootprintService;
51     private final JobCoordinator jobCoordinator;
52     private final InterVpnLinkCache interVpnLinkCache;
53
54     @Inject
55     public InterVpnLinkNodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalMgr,
56                                     final VpnFootprintService vpnFootprintService,
57                                     final JobCoordinator jobCoordinator, final InterVpnLinkCache interVpnLinkCache) {
58         this.dataBroker = dataBroker;
59         this.mdsalManager = mdsalMgr;
60         this.vpnFootprintService = vpnFootprintService;
61         this.jobCoordinator = jobCoordinator;
62         this.interVpnLinkCache = interVpnLinkCache;
63     }
64
65     @PostConstruct
66     public void start() {
67         LOG.info("{} start", getClass().getSimpleName());
68         registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
69     }
70
71     @Override
72     protected InstanceIdentifier<Node> getWildCardPath() {
73         return InstanceIdentifier.create(NetworkTopology.class)
74             .child(Topology.class, new TopologyKey(FLOW_TOPOLOGY_ID))
75             .child(Node.class);
76     }
77
78     @Override
79     protected InterVpnLinkNodeListener getDataTreeChangeListener() {
80         return InterVpnLinkNodeListener.this;
81     }
82
83     @Override
84     protected void add(InstanceIdentifier<Node> identifier, Node add) {
85         NodeId nodeId = add.getNodeId();
86         String[] node = nodeId.getValue().split(":");
87         if (node.length < 2) {
88             LOG.warn("Unexpected nodeId {}", nodeId.getValue());
89             return;
90         }
91         BigInteger dpId = new BigInteger(node[1]);
92         jobCoordinator.enqueueJob("IVpnLink" + dpId.toString(),
93             new InterVpnLinkNodeAddTask(dataBroker, mdsalManager, vpnFootprintService, dpId, interVpnLinkCache));
94     }
95
96     @Override
97     protected void remove(InstanceIdentifier<Node> identifier, Node del) {
98         LOG.trace("Node {} has been deleted", identifier.firstKeyOf(Node.class).toString());
99         NodeId nodeId = del.getNodeId();
100         String[] node = nodeId.getValue().split(":");
101         if (node.length < 2) {
102             LOG.warn("Unexpected nodeId {}", nodeId.getValue());
103             return;
104         }
105         BigInteger dpId = new BigInteger(node[1]);
106         List<InterVpnLinkDataComposite> allInterVpnLinks = interVpnLinkCache.getAllInterVpnLinks();
107         allInterVpnLinks.stream()
108                         .filter(ivl -> ivl.stepsOnDpn(dpId))           // Only those affected by DPN going down
109                         .forEach(this::reinstallInterVpnLink);         // Move them somewhere else
110     }
111
112     private void reinstallInterVpnLink(InterVpnLinkDataComposite ivl) {
113         String ivlName = ivl.getInterVpnLinkName();
114         LOG.debug("Reinstalling InterVpnLink {} affected by node going down", ivlName);
115         // Lets move the InterVpnLink to some other place. Basically, remove it and create it again
116         InstanceIdentifier<InterVpnLink> interVpnLinkIid = InterVpnLinkUtil.getInterVpnLinkPath(ivlName);
117         String specificJobKey = "InterVpnLink.update." + ivlName;
118         InterVpnLink interVpnLink = ivl.getInterVpnLinkConfig();
119         jobCoordinator.enqueueJob(specificJobKey, new InterVpnLinkRemoverTask(dataBroker, interVpnLinkIid));
120         jobCoordinator.enqueueJob(specificJobKey, new InterVpnLinkCleanedCheckerTask(dataBroker, interVpnLink));
121         jobCoordinator.enqueueJob(specificJobKey, new InterVpnLinkCreatorTask(dataBroker, interVpnLink));
122     }
123
124     @Override
125     protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
126     }
127 }