2bad35cb12b16547c08fdebe08badef7f80bd98e
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / DpnInVpnChangeListener.java
1 /*
2  * Copyright (c) 2016 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;
9
10 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
11
12 import com.google.common.base.Optional;
13 import java.math.BigInteger;
14 import java.util.Collection;
15 import java.util.List;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.locks.ReentrantLock;
18 import javax.inject.Inject;
19 import javax.inject.Singleton;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
23 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
24 import org.opendaylight.genius.infra.Datastore.Operational;
25 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
26 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
27 import org.opendaylight.genius.infra.TypedWriteTransaction;
28 import org.opendaylight.genius.utils.JvmGlobalLocks;
29 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEvent;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddInterfaceToDpnOnVpnEvent;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.OdlL3vpnListener;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveDpnEvent;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveInterfaceFromDpnOnVpnEvent;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.remove.dpn.event.RemoveEventData;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 @Singleton
43 public class DpnInVpnChangeListener implements OdlL3vpnListener {
44     private static final Logger LOG = LoggerFactory.getLogger(DpnInVpnChangeListener.class);
45     private final DataBroker dataBroker;
46     private final ManagedNewTransactionRunner txRunner;
47
48     @Inject
49     public DpnInVpnChangeListener(DataBroker dataBroker) {
50         this.dataBroker = dataBroker;
51         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
52     }
53
54     @Override
55     public void onAddDpnEvent(AddDpnEvent notification) {
56
57     }
58
59     @Override
60     public void onRemoveDpnEvent(RemoveDpnEvent notification) {
61
62         RemoveEventData eventData = notification.getRemoveEventData();
63         final String rd = eventData.getRd();
64         final String vpnName = eventData.getVpnName();
65         BigInteger dpnId = eventData.getDpnId().toJava();
66
67         LOG.trace("Remove Dpn Event notification received for rd {} VpnName {} DpnId {}", rd, vpnName, dpnId);
68         // FIXME: separate out to somehow?
69         final ReentrantLock lock = JvmGlobalLocks.getLockForString(vpnName);
70         lock.lock();
71         try {
72             InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(rd);
73             Optional<VpnInstanceOpDataEntry> vpnOpValue =
74                     SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
75             if (vpnOpValue.isPresent()) {
76                 VpnInstanceOpDataEntry vpnInstOpData = vpnOpValue.get();
77                 List<VpnToDpnList> vpnToDpnList = vpnInstOpData.nonnullVpnToDpnList();
78                 boolean flushDpnsOnVpn = true;
79                 for (VpnToDpnList dpn : vpnToDpnList) {
80                     if (dpn.getDpnState() == VpnToDpnList.DpnState.Active) {
81                         flushDpnsOnVpn = false;
82                         break;
83                     }
84                 }
85                 if (flushDpnsOnVpn) {
86                     try {
87                         txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
88                             tx -> deleteDpn(vpnToDpnList, rd, tx)).get();
89                     } catch (InterruptedException | ExecutionException e) {
90                         LOG.error("Error removing dpnToVpnList for vpn {} ", vpnName);
91                         throw new RuntimeException(e.getMessage(), e);
92                     }
93                 }
94             }
95         } catch (ReadFailedException e) {
96             LOG.error("onRemoveDpnEvent: Failed to read data store for rd {} vpn {} dpn {}", rd, vpnName, dpnId);
97         } finally {
98             lock.unlock();
99         }
100     }
101
102     protected void deleteDpn(Collection<VpnToDpnList> vpnToDpnList, String rd, TypedWriteTransaction<Operational> tx) {
103         for (final VpnToDpnList curDpn : vpnToDpnList) {
104             InstanceIdentifier<VpnToDpnList> vpnToDpnId = VpnHelper.getVpnToDpnListIdentifier(rd,
105                                                                         curDpn.getDpnId());
106             tx.delete(vpnToDpnId);
107         }
108     }
109
110     @Override
111     public void onAddInterfaceToDpnOnVpnEvent(AddInterfaceToDpnOnVpnEvent notification) {
112     }
113
114     @Override
115     public void onRemoveInterfaceFromDpnOnVpnEvent(RemoveInterfaceFromDpnOnVpnEvent notification) {
116     }
117 }
118