move vpnservice and cleanup poms
[netvirt.git] / cloud-servicechain / cloud-servicechain-impl / src / main / java / org / opendaylight / netvirt / cloudservicechain / listeners / VpnToDpnListener.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.cloudservicechain.listeners;
9
10 import com.google.common.base.Optional;
11 import java.math.BigInteger;
12 import java.util.List;
13
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.genius.mdsalutil.NwConstants;
18 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
19 import org.opendaylight.netvirt.cloudservicechain.CloudServiceChainConstants;
20 import org.opendaylight.netvirt.cloudservicechain.VPNServiceChainHandler;
21 import org.opendaylight.netvirt.cloudservicechain.utils.VpnServiceChainUtils;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.vpn.to.pseudo.port.list.VpnToPseudoPortData;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEvent;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddInterfaceToDpnOnVpnEvent;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.OdlL3vpnListener;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveDpnEvent;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveInterfaceFromDpnOnVpnEvent;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 @Singleton
33 public class VpnToDpnListener implements OdlL3vpnListener {
34
35     private static final Logger LOG = LoggerFactory.getLogger(VpnToDpnListener.class);
36     private final DataBroker broker;
37     private final IMdsalApiManager mdsalMgr;
38     private final VPNServiceChainHandler vpnScHandler;
39
40     @Inject
41     public VpnToDpnListener(final DataBroker db, final IMdsalApiManager mdsalManager,
42                             final VPNServiceChainHandler vpnServiceChainHandler) {
43         this.broker = db;
44         this.mdsalMgr = mdsalManager;
45         this.vpnScHandler = vpnServiceChainHandler;
46     }
47
48     @Override
49     public void onAddDpnEvent(AddDpnEvent notification) {
50         programVpnScfFlowsOnDpn(notification.getAddEventData().getDpnId(),
51                                 notification.getAddEventData().getVpnName(),
52                                 notification.getAddEventData().getRd(),
53                                 NwConstants.ADD_FLOW);
54
55     }
56
57     @Override
58     public void onRemoveDpnEvent(RemoveDpnEvent notification) {
59         programVpnScfFlowsOnDpn(notification.getRemoveEventData().getDpnId(),
60                                 notification.getRemoveEventData().getVpnName(),
61                                 notification.getRemoveEventData().getRd(),
62                                 NwConstants.DEL_FLOW);
63     }
64
65     private void programVpnScfFlowsOnDpn(BigInteger dpnId, String vpnName, String rd, int addOrRemove) {
66         String addedOrRemovedTxt = addOrRemove == NwConstants.ADD_FLOW ? " added " : " removed";
67         LOG.debug("DpnToVpn {} event received: dpn={}  vpn={}  rd={}", addedOrRemovedTxt, dpnId, vpnName, rd);
68         if (dpnId == null) {
69             LOG.warn("Dpn to Vpn {} event received, but no DPN specified in event", addedOrRemovedTxt);
70             return;
71         }
72
73         if (vpnName == null) {
74             LOG.warn("Dpn to Vpn {} event received, but no VPN specified in event", addedOrRemovedTxt);
75             return;
76         }
77
78         if (rd == null) {
79             LOG.warn("Dpn to Vpn {} event received, but no RD specified in event", addedOrRemovedTxt);
80             return;
81         }
82
83         Optional<VpnToPseudoPortData> optVpnToPseudoPortInfo = VpnServiceChainUtils.getVpnPseudoPortData(broker, rd);
84
85         if (!optVpnToPseudoPortInfo.isPresent()) {
86             LOG.debug("Dpn to Vpn {} event received: Could not find VpnPseudoLportTag for VPN name={}  rd={}",
87                       addedOrRemovedTxt, vpnName, rd);
88             return;
89         }
90
91         VpnToPseudoPortData vpnToPseudoPortInfo = optVpnToPseudoPortInfo.get();
92
93         // Vpn2Scf flows (LFIB + LportDispatcher)
94         // TODO: Should we filter out by bgp origin
95         List<VrfEntry> allVpnVrfEntries = VpnServiceChainUtils.getAllVrfEntries(broker, rd);
96         vpnScHandler.programVpnToScfPipelineOnDpn(dpnId, allVpnVrfEntries,
97                                                   vpnToPseudoPortInfo.getScfTableId(),
98                                                   vpnToPseudoPortInfo.getScfTag(),
99                                                   vpnToPseudoPortInfo.getVpnLportTag().intValue(),
100                                                   addOrRemove);
101
102         // Scf2Vpn flow (LportDispatcher)
103         long vpnId = addOrRemove == NwConstants.ADD_FLOW ? VpnServiceChainUtils.getVpnId(broker, vpnName)
104                 : CloudServiceChainConstants.INVALID_VPN_TAG;
105         VpnServiceChainUtils.programLPortDispatcherFlowForScfToVpn(mdsalMgr, vpnId, dpnId,
106                                                                    vpnToPseudoPortInfo.getVpnLportTag().intValue(),
107                                                                    addOrRemove);
108     }
109
110     @Override
111     public void onAddInterfaceToDpnOnVpnEvent(AddInterfaceToDpnOnVpnEvent notification) {
112     }
113
114     @Override
115     public void onRemoveInterfaceFromDpnOnVpnEvent(RemoveInterfaceFromDpnOnVpnEvent notification) {
116     }
117
118 }