NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / iplearn / IpMonitorStopTask.java
1 /*
2  * Copyright © 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.iplearn;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Objects;
14 import java.util.concurrent.Callable;
15 import org.opendaylight.genius.infra.Datastore;
16 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
17 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
18 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
21 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort;
23 import org.opendaylight.yangtools.yang.common.Uint32;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 public class IpMonitorStopTask implements Callable<List<? extends ListenableFuture<?>>> {
28     private static final Logger LOG = LoggerFactory.getLogger(IpMonitorStopTask.class);
29     private MacEntry macEntry;
30     private DataBroker dataBroker;
31     private final AlivenessMonitorUtils alivenessMonitorUtils;
32     private boolean isRemoveMipAdjAndLearntIp;
33     private final VpnUtil vpnUtil;
34     private final ManagedNewTransactionRunner txRunner;
35
36     public IpMonitorStopTask(MacEntry macEntry, DataBroker dataBroker, boolean removeMipAdjAndLearntIp, VpnUtil vpnUtil,
37                              AlivenessMonitorUtils alivenessMonitorUtils) {
38         this.macEntry = macEntry;
39         this.dataBroker = dataBroker;
40         this.alivenessMonitorUtils = alivenessMonitorUtils;
41         this.isRemoveMipAdjAndLearntIp = removeMipAdjAndLearntIp;
42         this.vpnUtil = vpnUtil;
43         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
44     }
45
46     @Override
47     public List<ListenableFuture<Void>> call() {
48         final List<ListenableFuture<Void>> futures = new ArrayList<>();
49         java.util.Optional<Uint32> monitorIdOptional = alivenessMonitorUtils.getMonitorIdFromInterface(macEntry);
50         if (monitorIdOptional.isPresent()) {
51             alivenessMonitorUtils.stopIpMonitoring(monitorIdOptional.get());
52         } else {
53             LOG.warn("MonitorId not available for IP {} interface {}. IpMonitoring not stopped",
54                     macEntry.getIpAddress(), macEntry.getInterfaceName());
55         }
56
57         String learntIp = macEntry.getIpAddress().getHostAddress();
58         if (this.isRemoveMipAdjAndLearntIp) {
59             String vpnName =  macEntry.getVpnName();
60             LearntVpnVipToPort vpnVipToPort = vpnUtil.getLearntVpnVipToPort(vpnName, learntIp);
61             if (vpnVipToPort != null && !Objects.equals(vpnVipToPort.getCreationTime(), macEntry.getCreatedTime())) {
62                 LOG.warn("The MIP {} over vpn {} has been learnt again and processed. "
63                         + "Ignoring this remove event.", learntIp, vpnName);
64                 return futures;
65             }
66             vpnUtil.removeLearntVpnVipToPort(macEntry.getVpnName(),
67                     macEntry.getIpAddress().getHostAddress(), null);
68             vpnUtil.removeVpnPortFixedIpToPort(dataBroker, macEntry.getVpnName(),
69                     macEntry.getIpAddress().getHostAddress(), null);
70
71             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(
72                     Datastore.CONFIGURATION, tx -> vpnUtil.removeMipAdjacency(macEntry.getVpnName(),
73                             macEntry.getInterfaceName(), macEntry.getIpAddress().getHostAddress(), tx)),
74                     LOG, "ArpMonitorStopTask: Error writing to datastore for Vpn {} IP  {}",
75                     macEntry.getVpnName(), macEntry.getIpAddress().getHostAddress());
76         } else {
77             // Delete only MIP adjacency
78             vpnUtil.removeMipAdjacency(macEntry.getInterfaceName(), learntIp);
79         }
80         return futures;
81     }
82 }