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