2 * Copyright (c) 2016 Cisco Systems. All rights reserved.
\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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
\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.v3po.rev161214.Loopback;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentationBuilder;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2Builder;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.LoopbackBuilder;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBasedBuilder;
\r
47 import java.util.Collections;
\r
48 import java.util.concurrent.ExecutionException;
\r
50 public class LoopbackCommandTest extends VppRendererDataBrokerTest {
\r
52 private final static String DESCRIPTION = "used for testing";
\r
53 private final static String INTERFACE_NAME = "testInterface";
\r
54 private final static String BRIDGE_DOMAIN = "testBD";
\r
55 private final static boolean IS_BVI = true;
\r
56 private final static PhysAddress MAC_ADDRESS = new PhysAddress("00:11:22:33:44:55");
\r
57 private final static IpAddress IP_ADDRESS = new IpAddress(new Ipv4Address("10.0.0.1"));
\r
58 private final static IpPrefix IP_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.1/24"));
\r
60 private final static String UPD_DESCRIPTION = "updated description";
\r
61 private final static PhysAddress UPD_MAC_ADDRESS = new PhysAddress("55:44:33:22:11:00");
\r
62 private final static IpAddress UPD_IP_ADDRESS = new IpAddress(new Ipv4Address("20.0.0.1"));
\r
63 private final static IpPrefix UPD_IP_PREFIX = new IpPrefix(new Ipv4Prefix("20.0.0.1/24"));
\r
65 private final static VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()
\r
66 .setLoopback(new LoopbackBuilder().setMac(MAC_ADDRESS).build());
\r
68 private final static VppInterfaceAugmentationBuilder vppAugmentationBuilderWithBD =
\r
69 new VppInterfaceAugmentationBuilder(vppAugmentationBuilder.build())
\r
70 .setL2(new L2Builder().setInterconnection(new BridgeBasedBuilder().setBridgeDomain(BRIDGE_DOMAIN)
\r
71 .setBridgedVirtualInterface(IS_BVI).setSplitHorizonGroup((short)0)
\r
74 private final static InterfaceBuilder interfaceBuilder =
\r
75 new InterfaceBuilder().setKey(new InterfaceKey(INTERFACE_NAME))
\r
77 .setDescription(DESCRIPTION)
\r
78 .setType(Loopback.class)
\r
79 .setName(INTERFACE_NAME)
\r
80 .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);
\r
82 private final static Interface1Builder
\r
84 new Interface1Builder().setIpv4(new Ipv4Builder().setAddress(Collections.singletonList(
\r
85 new AddressBuilder()
\r
86 .setIp(new Ipv4AddressNoZone(IP_ADDRESS.getIpv4Address()))
\r
87 .setSubnet(new PrefixLengthBuilder().setPrefixLength((short) NetUtils.getMaskFromPrefix(IP_PREFIX.getIpv4Prefix().getValue())).build())
\r
90 .setForwarding(false)
\r
93 private final static Interface BASIC_INTERFACE =
\r
94 interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build())
\r
95 .addAugmentation(Interface1.class, interface1Builder.build()).build();
\r
97 private final static Interface BASIC_INTERFACE_WITH_BD = interfaceBuilder
\r
98 .addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilderWithBD.build()).build();
\r
100 private DataBroker dataBroker;
\r
103 public void init() {
\r
104 dataBroker = getDataBroker();
\r
108 public void testAddLoopback() throws ExecutionException, InterruptedException {
\r
109 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
\r
110 LoopbackCommand addCommand = LoopbackCommand.builder()
\r
111 .setOperation(General.Operations.PUT)
\r
112 .setInterfaceName(INTERFACE_NAME)
\r
113 .setDescription(DESCRIPTION)
\r
115 .setPhysAddress(MAC_ADDRESS)
\r
116 .setIpPrefix(IP_PREFIX)
\r
117 .setIpAddress(IP_ADDRESS)
\r
121 Assert.assertEquals(IS_BVI, addCommand.getBvi());
\r
122 Assert.assertEquals(MAC_ADDRESS, addCommand.getPhysAddress());
\r
123 Assert.assertEquals(IP_ADDRESS, addCommand.getIpAddress());
\r
124 Assert.assertEquals(IP_PREFIX, addCommand.getIpPrefix());
\r
126 Optional<Interface> optional = executeCommand(rwTx, addCommand);
\r
128 Assert.assertTrue(optional.isPresent());
\r
129 Assert.assertEquals(BASIC_INTERFACE, optional.get());
\r
134 public void testAddLoopback_WithBridgeDomain() throws ExecutionException, InterruptedException {
\r
135 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
\r
136 LoopbackCommand addCommand = LoopbackCommand.builder()
\r
137 .setOperation(General.Operations.PUT)
\r
138 .setInterfaceName(INTERFACE_NAME)
\r
139 .setDescription(DESCRIPTION)
\r
141 .setPhysAddress(MAC_ADDRESS)
\r
142 .setIpPrefix(IP_PREFIX)
\r
143 .setIpAddress(IP_ADDRESS)
\r
144 .setBridgeDomain(BRIDGE_DOMAIN)
\r
148 Assert.assertEquals(BRIDGE_DOMAIN, addCommand.getBridgeDomain());
\r
150 Optional<Interface> optional = executeCommand(rwTx, addCommand);
\r
152 Assert.assertTrue(optional.isPresent());
\r
153 Assert.assertEquals(BASIC_INTERFACE_WITH_BD, optional.get());
\r
157 private Optional<Interface> executeCommand(ReadWriteTransaction rwTx, LoopbackCommand addCommand)
\r
158 throws ExecutionException, InterruptedException {
\r
159 addCommand.execute(rwTx);
\r
161 rwTx.submit().get();
\r
163 ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
\r
165 return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
\r
166 VppIidFactory.getInterfaceIID(new InterfaceKey(INTERFACE_NAME)), rTx);
\r
170 public void testDeleteLoopbackPort() throws ExecutionException, InterruptedException {
\r
171 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
\r
173 rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),
\r
174 BASIC_INTERFACE, true);
\r
175 rwTx.submit().get();
\r
177 Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
\r
178 VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());
\r
180 Assert.assertTrue(optional.isPresent());
\r
182 LoopbackCommand deleteCommand = LoopbackCommand.builder()
\r
183 .setOperation(General.Operations.DELETE)
\r
184 .setInterfaceName(INTERFACE_NAME)
\r
187 ReadWriteTransaction rwTxDel = dataBroker.newReadWriteTransaction();
\r
188 deleteCommand.execute(rwTxDel);
\r
191 Optional<Interface> optionalDeleted = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
\r
192 VppIidFactory.getInterfaceIID(new InterfaceKey(deleteCommand.getName())),
\r
193 dataBroker.newReadOnlyTransaction());
\r
195 Assert.assertFalse(optionalDeleted.isPresent());
\r
199 public void testUpdateLoopbackPort() throws ExecutionException, InterruptedException {
\r
200 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
\r
202 rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),
\r
203 BASIC_INTERFACE, true);
\r
204 rwTx.submit().get();
\r
206 Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
\r
207 VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());
\r
209 Assert.assertTrue(optional.isPresent());
\r
211 LoopbackCommand updateCommand = LoopbackCommand.builder()
\r
212 .setOperation(General.Operations.MERGE)
\r
213 .setInterfaceName(INTERFACE_NAME)
\r
214 .setDescription(UPD_DESCRIPTION)
\r
215 .setPhysAddress(UPD_MAC_ADDRESS)
\r
216 .setIpPrefix(UPD_IP_PREFIX)
\r
217 .setIpAddress(UPD_IP_ADDRESS)
\r
221 ReadWriteTransaction rwTxUpd = dataBroker.newReadWriteTransaction();
\r
222 updateCommand.execute(rwTxUpd);
\r
223 rwTxUpd.submit().get();
\r
225 Optional<Interface> optionalUpdated = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
\r
226 VppIidFactory.getInterfaceIID(new InterfaceKey(updateCommand.getName())),
\r
227 dataBroker.newReadOnlyTransaction());
\r
229 Assert.assertTrue(optionalUpdated.isPresent());
\r
230 Interface updatedInterface = optionalUpdated.get();
\r
232 Assert.assertEquals(UPD_DESCRIPTION, updatedInterface.getDescription());
\r
233 Assert.assertFalse(updatedInterface.isEnabled());
\r
234 VppInterfaceAugmentation augmentation = updatedInterface.getAugmentation(VppInterfaceAugmentation.class);
\r
235 Assert.assertEquals(INTERFACE_NAME, updatedInterface.getName());
\r
236 Assert.assertEquals(UPD_MAC_ADDRESS, augmentation.getLoopback().getMac());
\r
237 Interface1 interface1 = updatedInterface.getAugmentation(Interface1.class);
\r
239 // merge operation will add new ip address to list so index is 1 for new ip
\r
240 String ip = interface1.getIpv4().getAddress().get(1).getIp().getValue();
\r
241 Subnet subnet = interface1.getIpv4().getAddress().get(1).getSubnet();
\r
242 String prefix = "";
\r
244 if ( subnet instanceof PrefixLength){
\r
245 prefix = ((PrefixLength) subnet).getPrefixLength().toString();
\r
247 IpPrefix ipPrefix = new IpPrefix(new Ipv4Prefix(ip + "/" + prefix));
\r
248 IpAddress ipAddress = new IpAddress( new Ipv4Address(ip));
\r
249 Assert.assertEquals(UPD_IP_PREFIX, ipPrefix);
\r
250 Assert.assertEquals(UPD_IP_ADDRESS, ipAddress);
\r