2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.netvirt.cloudservicechain.listeners;
10 import com.google.common.base.Optional;
11 import java.math.BigInteger;
12 import java.util.List;
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;
33 public class VpnToDpnListener implements OdlL3vpnListener {
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;
41 public VpnToDpnListener(final DataBroker db, final IMdsalApiManager mdsalManager,
42 final VPNServiceChainHandler vpnServiceChainHandler) {
44 this.mdsalMgr = mdsalManager;
45 this.vpnScHandler = vpnServiceChainHandler;
49 public void onAddDpnEvent(AddDpnEvent notification) {
50 programVpnScfFlowsOnDpn(notification.getAddEventData().getDpnId(),
51 notification.getAddEventData().getVpnName(),
52 notification.getAddEventData().getRd(),
53 NwConstants.ADD_FLOW);
58 public void onRemoveDpnEvent(RemoveDpnEvent notification) {
59 programVpnScfFlowsOnDpn(notification.getRemoveEventData().getDpnId(),
60 notification.getRemoveEventData().getVpnName(),
61 notification.getRemoveEventData().getRd(),
62 NwConstants.DEL_FLOW);
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);
69 LOG.warn("Dpn to Vpn {} event received, but no DPN specified in event", addedOrRemovedTxt);
73 if (vpnName == null) {
74 LOG.warn("Dpn to Vpn {} event received, but no VPN specified in event", addedOrRemovedTxt);
79 LOG.warn("Dpn to Vpn {} event received, but no RD specified in event", addedOrRemovedTxt);
83 Optional<VpnToPseudoPortData> optVpnToPseudoPortInfo = VpnServiceChainUtils.getVpnPseudoPortData(broker, rd);
85 if (!optVpnToPseudoPortInfo.isPresent()) {
86 LOG.debug("Dpn to Vpn {} event received: Could not find VpnPseudoLportTag for VPN name={} rd={}",
87 addedOrRemovedTxt, vpnName, rd);
91 VpnToPseudoPortData vpnToPseudoPortInfo = optVpnToPseudoPortInfo.get();
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(),
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(),
111 public void onAddInterfaceToDpnOnVpnEvent(AddInterfaceToDpnOnVpnEvent notification) {
115 public void onRemoveInterfaceFromDpnOnVpnEvent(RemoveInterfaceFromDpnOnVpnEvent notification) {