Bug 7966: Fix route origin for some vrfEntries after VM migration
[netvirt.git] / vpnservice / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / netvirt / vpnmanager / populator / impl / L3vpnPopulator.java
1 /*
2  * Copyright (c) 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.populator.impl;
9
10 import java.util.Collections;
11 import java.util.List;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
16 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
17 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
18 import org.opendaylight.netvirt.vpnmanager.VpnInterfaceManager;
19 import org.opendaylight.netvirt.vpnmanager.populator.input.L3vpnInput;
20 import org.opendaylight.netvirt.vpnmanager.populator.intfc.VpnPopulator;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 public class L3vpnPopulator implements VpnPopulator {
28     protected final VpnInterfaceManager vpnInterfaceManager;
29     protected final IBgpManager bgpManager;
30     protected final IFibManager fibManager;
31     protected final DataBroker broker;
32     private static final Logger LOG = LoggerFactory.getLogger(L3vpnPopulator.class);
33
34     protected L3vpnPopulator(DataBroker dataBroker, VpnInterfaceManager vpnInterfaceManager,
35                              IBgpManager bgpManager, IFibManager fibManager) {
36         this.vpnInterfaceManager = vpnInterfaceManager;
37         this.bgpManager = bgpManager;
38         this.fibManager = fibManager;
39         this.broker = dataBroker;
40     }
41
42     @Override
43     public void populateFib(L3vpnInput input, WriteTransaction writeCfgTxn,
44                             WriteTransaction writeOperTxn) {}
45
46     @Override
47     public Adjacency createOperationalAdjacency(L3vpnInput input) {
48         return new AdjacencyBuilder().build();
49     }
50
51     @SuppressWarnings("checkstyle:IllegalCatch")
52     protected void addPrefixToBGP(String rd, String primaryRd, String macAddress, String prefix, String nextHopIp,
53                                   VrfEntry.EncapType encapType, long label, long l3vni, String gatewayMac,
54                                   RouteOrigin origin, WriteTransaction writeConfigTxn) {
55         try {
56             List<String> nextHopList = Collections.singletonList(nextHopIp);
57             LOG.info("ADD: Adding Fib entry rd {} prefix {} nextHop {} label {} l3vni {} origin {}",
58                      rd, prefix, nextHopIp, label, l3vni, origin.getValue());
59             fibManager.addOrUpdateFibEntry(broker, primaryRd, macAddress, prefix, nextHopList,
60                     encapType, (int)label, l3vni, gatewayMac, origin, writeConfigTxn);
61             LOG.info("ADD: Added Fib entry rd {} prefix {} nextHop {} label {}, l3vni {} origin {}",
62                      rd, prefix, nextHopIp, label, l3vni, origin.getValue());
63             // Advertise the prefix to BGP only if nexthop ip is available
64             if (nextHopList != null && !nextHopList.isEmpty()) {
65                 bgpManager.advertisePrefix(rd, macAddress, prefix, nextHopList, encapType, (int)label,
66                         l3vni, gatewayMac);
67             } else {
68                 LOG.warn("NextHopList is null/empty. Hence rd {} prefix {} is not advertised to BGP", rd, prefix);
69             }
70         } catch (Exception e) {
71             LOG.error("Add prefix failed", e);
72         }
73     }
74 }