NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / elanmanager / impl / src / test / java / org / opendaylight / netvirt / elanmanager / tests / utils / EvpnTestHelper.java
1 /*
2  * Copyright © 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.elanmanager.tests.utils;
9
10 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.DCGW_TEPIP;
11 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.ELAN1;
12 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.ELAN1_SEGMENT_ID;
13 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.EVPN1;
14 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.RD;
15
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.stream.Collectors;
19 import javax.inject.Inject;
20 import javax.inject.Singleton;
21 import org.apache.commons.lang3.StringUtils;
22 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.mdsal.common.api.ReadFailedException;
25 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
26 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
27 import org.opendaylight.netvirt.elanmanager.tests.ExpectedObjects;
28 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
29 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
30 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
31 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksContainer;
32 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.Networks;
33 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.NetworksKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentation;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentationBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntry;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentrybase.RoutePaths;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.EvpnRdToNetworks;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetwork;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkKey;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 import org.opendaylight.yangtools.yang.common.Uint32;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57 @Singleton
58 public class EvpnTestHelper  {
59     private static final Logger LOG = LoggerFactory.getLogger(EvpnTestHelper.class);
60     private SingleTransactionDataBroker singleTxdataBroker;
61
62     @Inject
63     public EvpnTestHelper(SingleTransactionDataBroker singleTxdataBroker) {
64         this.singleTxdataBroker = singleTxdataBroker;
65     }
66
67     public void updateRdtoNetworks(ElanInstance actualElanInstances) throws TransactionCommitFailedException {
68         EvpnRdToNetworkBuilder evpnRdToNetworkBuilder = new EvpnRdToNetworkBuilder()
69                 .withKey(new EvpnRdToNetworkKey(RD));
70         evpnRdToNetworkBuilder.setRd(RD);
71         evpnRdToNetworkBuilder.setNetworkId(ELAN1);
72         LOG.info("updating Evpn {} with elaninstance {} and rd {}", "evpn1", actualElanInstances, RD);
73         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD),
74                 evpnRdToNetworkBuilder.build());
75     }
76
77     public InstanceIdentifier<EvpnRdToNetwork> getRdToNetworkIdentifier(String vrfId) {
78         return InstanceIdentifier.builder(EvpnRdToNetworks.class)
79                 .child(EvpnRdToNetwork.class, new EvpnRdToNetworkKey(vrfId)).build();
80     }
81
82     public void updateEvpnNameInElan(String elanInstanceName, String evpnName)
83             throws ReadFailedException, TransactionCommitFailedException {
84         InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
85         ElanInstance  elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
86         EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
87         ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
88         evpnAugmentationBuilder.setEvpnName(evpnName);
89         LOG.debug("Writing Elan-EvpnAugmentation evpnName {} with key {}", evpnName, elanInstanceName);
90         elanInstanceBuilder.addAugmentation(EvpnAugmentation.class, evpnAugmentationBuilder.build());
91         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
92     }
93
94     public void deleteEvpnNameInElan(String elanInstanceName)
95             throws ReadFailedException, TransactionCommitFailedException {
96         InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
97         ElanInstance  elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
98
99         EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
100         ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
101         evpnAugmentationBuilder.setEvpnName(null);
102         LOG.debug("deleting evpn name from Elan-EvpnAugmentation {} ",  elanInstanceName);
103         elanInstanceBuilder.addAugmentation(EvpnAugmentation.class, evpnAugmentationBuilder.build());
104         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
105     }
106
107     public void deleteRdtoNetworks() throws TransactionCommitFailedException {
108         LOG.info("deleting  rd {}", "evpn1", RD);
109         singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD));
110     }
111
112     public void addMacVrfEntryToDS(String rd, String macAddress, String prefix,
113                                    List<String> nextHopList, VrfEntry.EncapType encapType,
114                                    Uint32 l2vni, String gatewayMacAddress, RouteOrigin origin)
115             throws TransactionCommitFailedException {
116         MacVrfEntryBuilder macEntryBuilder = new MacVrfEntryBuilder().setOrigin(origin.getValue());
117         buildVpnEncapSpecificInfo(macEntryBuilder, encapType, l2vni, macAddress,
118                 gatewayMacAddress, nextHopList);
119         macEntryBuilder.setMac(macAddress);
120         macEntryBuilder.setDestPrefix(prefix);
121         InstanceIdentifier<MacVrfEntry> macEntryId =
122                 InstanceIdentifier.builder(FibEntries.class)
123                         .child(VrfTables.class, new VrfTablesKey(rd))
124                         .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress)).build();
125
126         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, macEntryId, macEntryBuilder.build());
127     }
128
129     public void deleteMacVrfEntryToDS(String rd, String macAddress) throws TransactionCommitFailedException {
130         InstanceIdentifier<MacVrfEntry> macEntryId =
131                 InstanceIdentifier.builder(FibEntries.class)
132                         .child(VrfTables.class, new VrfTablesKey(rd))
133                         .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress)).build();
134
135         singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, macEntryId);
136     }
137
138     private static void buildVpnEncapSpecificInfo(MacVrfEntryBuilder builder,
139                                                   VrfEntry.EncapType encapType, Uint32 l2vni, String macAddress,
140                                                   String gatewayMac, List<String> nextHopList) {
141         builder.setEncapType(encapType);
142         builder.setGatewayMacAddress(gatewayMac);
143         builder.setL2vni(l2vni);
144         List<RoutePaths> routePaths = nextHopList.stream()
145                 .filter(StringUtils::isNotEmpty)
146                 .map(nextHop -> {
147                     return FibHelper.buildRoutePath(nextHop, null);
148                 }).collect(Collectors.toList());
149         builder.setRoutePaths(routePaths);
150     }
151
152     public void attachEvpnToNetwork(ElanInstance elanInstance)
153             throws TransactionCommitFailedException, ReadFailedException {
154         // update RD to networks
155         updateRdtoNetworks(elanInstance);
156
157         // Attach EVPN to a network
158         updateEvpnNameInElan(ExpectedObjects.ELAN1, EVPN1);
159     }
160
161     public void detachEvpnToNetwork(String elanName) throws TransactionCommitFailedException, ReadFailedException {
162         deleteEvpnNameInElan(elanName);
163         deleteRdtoNetworks();
164     }
165
166     public void handleEvpnRt2Recvd(String macRecvd, String prefixRecvd) throws TransactionCommitFailedException {
167         List<String> nextHopList = new ArrayList<>();
168         nextHopList.add(DCGW_TEPIP);
169         addMacVrfEntryToDS(RD, macRecvd, prefixRecvd, nextHopList, VrfEntry.EncapType.Vxlan,
170                 ELAN1_SEGMENT_ID, null, RouteOrigin.BGP);
171     }
172
173     public InstanceIdentifier<MacVrfEntry> buildMacVrfEntryIid(String mac)  {
174         return InstanceIdentifier.builder(FibEntries.class)
175                 .child(VrfTables.class, new VrfTablesKey(RD))
176                 .child(MacVrfEntry.class, new MacVrfEntryKey(mac)).build();
177     }
178
179     public InstanceIdentifier<Networks> buildBgpNetworkIid(String prefix)  {
180         return InstanceIdentifier.builder(Bgp.class)
181                 .child(NetworksContainer.class)
182                 .child(Networks.class, new NetworksKey(prefix, RD)).build();
183     }
184
185 }