745ece86f6e6706b5be3d34ecc6722efe9ba722d
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / commands / LoopbackCommandTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems. 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
10
11 import com.google.common.base.Optional;
12 import org.junit.Assert;
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;
20 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
22 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
23 import org.opendaylight.groupbasedpolicy.util.NetUtils;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface1;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface1Builder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4Builder;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.AddressBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.Subnet;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLength;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLengthBuilder;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev170816.NatInterfaceAugmentation;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev170816.NatInterfaceAugmentationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev170816._interface.nat.attributes.NatBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev170816._interface.nat.attributes.nat.InboundBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.Loopback;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VppInterfaceAugmentation;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VppInterfaceAugmentationBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.interfaces._interface.L2Builder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.interfaces._interface.LoopbackBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.l2.config.attributes.interconnection.BridgeBasedBuilder;
50
51 import java.util.Collections;
52 import java.util.concurrent.ExecutionException;
53
54 public class LoopbackCommandTest extends VppRendererDataBrokerTest {
55
56     private final static String DESCRIPTION = "used for testing";
57     private final static String INTERFACE_NAME = "testInterface";
58     private final static String BRIDGE_DOMAIN = "testBD";
59     private final static boolean IS_BVI = true;
60     private final static PhysAddress MAC_ADDRESS = new PhysAddress("00:11:22:33:44:55");
61     private final static IpAddress IP_ADDRESS = new IpAddress(new Ipv4Address("10.0.0.1"));
62     private final static IpPrefix IP_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.1/24"));
63
64     private final static String UPD_DESCRIPTION = "updated description";
65     private final static PhysAddress UPD_MAC_ADDRESS = new PhysAddress("55:44:33:22:11:00");
66     private final static IpAddress UPD_IP_ADDRESS = new IpAddress(new Ipv4Address("20.0.0.1"));
67     private final static IpPrefix UPD_IP_PREFIX = new IpPrefix(new Ipv4Prefix("20.0.0.1/24"));
68
69     private final static VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()
70         .setLoopback(new LoopbackBuilder().setMac(MAC_ADDRESS).build());
71
72     private final static VppInterfaceAugmentationBuilder vppAugmentationBuilderWithBD =
73             new VppInterfaceAugmentationBuilder(vppAugmentationBuilder.build())
74                 .setL2(new L2Builder().setInterconnection(new BridgeBasedBuilder().setBridgeDomain(BRIDGE_DOMAIN)
75                     .setBridgedVirtualInterface(IS_BVI).setSplitHorizonGroup((short)0)
76                     .build()).build());
77
78     private final static InterfaceBuilder interfaceBuilder =
79             new InterfaceBuilder().setKey(new InterfaceKey(INTERFACE_NAME))
80                 .setEnabled(true)
81                 .setDescription(DESCRIPTION)
82                 .setType(Loopback.class)
83                 .setName(INTERFACE_NAME)
84                 .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);
85
86     private final static Interface1Builder
87         interface1Builder =
88         new Interface1Builder().setIpv4(new Ipv4Builder().setAddress(Collections.singletonList(
89             new AddressBuilder()
90                 .setIp(new Ipv4AddressNoZone(IP_ADDRESS.getIpv4Address()))
91                 .setSubnet(new PrefixLengthBuilder().setPrefixLength((short) NetUtils.getMaskFromPrefix(IP_PREFIX.getIpv4Prefix().getValue())).build())
92                 .build()))
93             .setEnabled(true)
94             .setForwarding(false)
95             .build());
96
97     private final static Interface BASIC_INTERFACE =
98             interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build())
99                 .addAugmentation(NatInterfaceAugmentation.class, new NatInterfaceAugmentationBuilder().setNat(
100                     new NatBuilder().setInbound(
101                         new InboundBuilder().setNat44Support(true).setPostRouting(false).build()).build())
102                     .build())
103                 .addAugmentation(Interface1.class, interface1Builder.build()).build();
104
105     private final static Interface BASIC_INTERFACE_WITH_BD = interfaceBuilder
106         .addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilderWithBD.build()).build();
107
108     private DataBroker dataBroker;
109
110     @Before
111     public void init() {
112         dataBroker = getDataBroker();
113     }
114
115     @Test
116     public void testAddLoopback() throws ExecutionException, InterruptedException {
117         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
118         LoopbackCommand addCommand = LoopbackCommand.builder()
119             .setOperation(General.Operations.PUT)
120             .setInterfaceName(INTERFACE_NAME)
121             .setDescription(DESCRIPTION)
122             .setBvi(IS_BVI)
123             .setPhysAddress(MAC_ADDRESS)
124             .setIpPrefix(IP_PREFIX)
125             .setIpAddress(IP_ADDRESS)
126             .setEnabled(true)
127             .build();
128
129         Assert.assertEquals(IS_BVI, addCommand.getBvi());
130         Assert.assertEquals(MAC_ADDRESS, addCommand.getPhysAddress());
131         Assert.assertEquals(IP_ADDRESS, addCommand.getIpAddress());
132         Assert.assertEquals(IP_PREFIX, addCommand.getIpPrefix());
133
134         Optional<Interface> optional = executeCommand(rwTx, addCommand);
135
136         Assert.assertTrue(optional.isPresent());
137         Assert.assertEquals(BASIC_INTERFACE, optional.get());
138
139     }
140
141     @Test
142     public void testAddLoopback_WithBridgeDomain() throws ExecutionException, InterruptedException {
143         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
144         LoopbackCommand addCommand = LoopbackCommand.builder()
145             .setOperation(General.Operations.PUT)
146             .setInterfaceName(INTERFACE_NAME)
147             .setDescription(DESCRIPTION)
148             .setBvi(true)
149             .setPhysAddress(MAC_ADDRESS)
150             .setIpPrefix(IP_PREFIX)
151             .setIpAddress(IP_ADDRESS)
152             .setBridgeDomain(BRIDGE_DOMAIN)
153             .setEnabled(true)
154             .build();
155
156         Assert.assertEquals(BRIDGE_DOMAIN, addCommand.getBridgeDomain());
157
158         Optional<Interface> optional = executeCommand(rwTx, addCommand);
159
160         Assert.assertTrue(optional.isPresent());
161         Assert.assertEquals(BASIC_INTERFACE_WITH_BD, optional.get());
162     }
163
164     private Optional<Interface> executeCommand(ReadWriteTransaction rwTx, LoopbackCommand addCommand)
165             throws ExecutionException, InterruptedException {
166         addCommand.execute(rwTx);
167
168         rwTx.submit().get();
169
170         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
171
172         return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
173                 VppIidFactory.getInterfaceIID(new InterfaceKey(INTERFACE_NAME)), rTx);
174     }
175
176     @Test
177     public void testDeleteLoopbackPort() throws ExecutionException, InterruptedException {
178         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
179
180         rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),
181                 BASIC_INTERFACE, true);
182         rwTx.submit().get();
183
184         Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
185                 VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());
186
187         Assert.assertTrue(optional.isPresent());
188
189         LoopbackCommand deleteCommand = LoopbackCommand.builder()
190             .setOperation(General.Operations.DELETE)
191             .setInterfaceName(INTERFACE_NAME)
192             .setIpPrefix(IP_PREFIX)
193             .setIpAddress(IP_ADDRESS)
194             .build();
195
196         ReadWriteTransaction rwTxDel = dataBroker.newReadWriteTransaction();
197         deleteCommand.execute(rwTxDel);
198         rwTxDel.submit();
199
200         Optional<Interface> optionalDeleted = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
201                 VppIidFactory.getInterfaceIID(new InterfaceKey(deleteCommand.getName())),
202                 dataBroker.newReadOnlyTransaction());
203
204         Assert.assertFalse(optionalDeleted.isPresent());
205     }
206
207     @Test
208     public void testUpdateLoopbackPort() throws ExecutionException, InterruptedException {
209         ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
210
211         rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),
212                 BASIC_INTERFACE, true);
213         rwTx.submit().get();
214
215         Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
216                 VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());
217
218         Assert.assertTrue(optional.isPresent());
219
220         LoopbackCommand updateCommand = LoopbackCommand.builder()
221             .setOperation(General.Operations.MERGE)
222             .setInterfaceName(INTERFACE_NAME)
223             .setDescription(UPD_DESCRIPTION)
224             .setPhysAddress(UPD_MAC_ADDRESS)
225             .setIpPrefix(UPD_IP_PREFIX)
226             .setIpAddress(UPD_IP_ADDRESS)
227             .setEnabled(false)
228             .build();
229
230         ReadWriteTransaction rwTxUpd = dataBroker.newReadWriteTransaction();
231         updateCommand.execute(rwTxUpd);
232         rwTxUpd.submit().get();
233
234         Optional<Interface> optionalUpdated = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
235                 VppIidFactory.getInterfaceIID(new InterfaceKey(updateCommand.getName())),
236                 dataBroker.newReadOnlyTransaction());
237
238         Assert.assertTrue(optionalUpdated.isPresent());
239         Interface updatedInterface = optionalUpdated.get();
240
241         Assert.assertEquals(UPD_DESCRIPTION, updatedInterface.getDescription());
242         Assert.assertFalse(updatedInterface.isEnabled());
243         VppInterfaceAugmentation augmentation = updatedInterface.getAugmentation(VppInterfaceAugmentation.class);
244         Assert.assertEquals(INTERFACE_NAME, updatedInterface.getName());
245         Assert.assertEquals(UPD_MAC_ADDRESS, augmentation.getLoopback().getMac());
246         Interface1 interface1 = updatedInterface.getAugmentation(Interface1.class);
247
248         // merge operation will add new ip address to list so index is 1 for new ip
249         String ip = interface1.getIpv4().getAddress().get(1).getIp().getValue();
250         Subnet subnet = interface1.getIpv4().getAddress().get(1).getSubnet();
251         String prefix = "";
252
253         if ( subnet instanceof PrefixLength){
254             prefix = ((PrefixLength) subnet).getPrefixLength().toString();
255         }
256         IpPrefix ipPrefix = new IpPrefix(new Ipv4Prefix(ip + "/" + prefix));
257         IpAddress ipAddress = new IpAddress( new Ipv4Address(ip));
258         Assert.assertEquals(UPD_IP_PREFIX, ipPrefix);
259         Assert.assertEquals(UPD_IP_ADDRESS, ipAddress);
260     }
261 }