--- /dev/null
+/*\r
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
+\r
+import com.google.common.base.Optional;\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
+import org.opendaylight.groupbasedpolicy.util.NetUtils;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface1;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface1Builder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4Builder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.AddressBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.Subnet;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLength;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLengthBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.Loopback;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentationBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2Builder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.LoopbackBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBasedBuilder;\r
+\r
+import java.util.Collections;\r
+import java.util.concurrent.ExecutionException;\r
+\r
+public class LoopbackCommandTest extends VppRendererDataBrokerTest {\r
+\r
+ private final static String DESCRIPTION = "used for testing";\r
+ private final static String INTERFACE_NAME = "testInterface";\r
+ private final static String BRIDGE_DOMAIN = "testBD";\r
+ private final static boolean IS_BVI = true;\r
+ private final static PhysAddress MAC_ADDRESS = new PhysAddress("00:11:22:33:44:55");\r
+ private final static IpAddress IP_ADDRESS = new IpAddress(new Ipv4Address("10.0.0.1"));\r
+ private final static IpPrefix IP_PREFIX = new IpPrefix(new Ipv4Prefix("10.0.0.1/24"));\r
+\r
+ private final static String UPD_DESCRIPTION = "updated description";\r
+ private final static PhysAddress UPD_MAC_ADDRESS = new PhysAddress("55:44:33:22:11:00");\r
+ private final static IpAddress UPD_IP_ADDRESS = new IpAddress(new Ipv4Address("20.0.0.1"));\r
+ private final static IpPrefix UPD_IP_PREFIX = new IpPrefix(new Ipv4Prefix("20.0.0.1/24"));\r
+\r
+ private final static VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()\r
+ .setLoopback(new LoopbackBuilder().setMac(MAC_ADDRESS).build());\r
+\r
+ private final static VppInterfaceAugmentationBuilder vppAugmentationBuilderWithBD =\r
+ new VppInterfaceAugmentationBuilder(vppAugmentationBuilder.build())\r
+ .setL2(new L2Builder().setInterconnection(new BridgeBasedBuilder().setBridgeDomain(BRIDGE_DOMAIN)\r
+ .setBridgedVirtualInterface(IS_BVI).setSplitHorizonGroup((short)0)\r
+ .build()).build());\r
+\r
+ private final static InterfaceBuilder interfaceBuilder =\r
+ new InterfaceBuilder().setKey(new InterfaceKey(INTERFACE_NAME))\r
+ .setEnabled(true)\r
+ .setDescription(DESCRIPTION)\r
+ .setType(Loopback.class)\r
+ .setName(INTERFACE_NAME)\r
+ .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);\r
+\r
+ private final static Interface1Builder\r
+ interface1Builder =\r
+ new Interface1Builder().setIpv4(new Ipv4Builder().setAddress(Collections.singletonList(\r
+ new AddressBuilder()\r
+ .setIp(new Ipv4AddressNoZone(IP_ADDRESS.getIpv4Address()))\r
+ .setSubnet(new PrefixLengthBuilder().setPrefixLength((short) NetUtils.getMaskFromPrefix(IP_PREFIX.getIpv4Prefix().getValue())).build())\r
+ .build()))\r
+ .setEnabled(true)\r
+ .setForwarding(false)\r
+ .build());\r
+\r
+ private final static Interface BASIC_INTERFACE =\r
+ interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build())\r
+ .addAugmentation(Interface1.class, interface1Builder.build()).build();\r
+\r
+ private final static Interface BASIC_INTERFACE_WITH_BD = interfaceBuilder\r
+ .addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilderWithBD.build()).build();\r
+\r
+ private DataBroker dataBroker;\r
+\r
+ @Before\r
+ public void init() {\r
+ dataBroker = getDataBroker();\r
+ }\r
+\r
+ @Test\r
+ public void testAddLoopback() throws ExecutionException, InterruptedException {\r
+ ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+ LoopbackCommand addCommand = LoopbackCommand.builder()\r
+ .setOperation(General.Operations.PUT)\r
+ .setInterfaceName(INTERFACE_NAME)\r
+ .setDescription(DESCRIPTION)\r
+ .setBvi(IS_BVI)\r
+ .setPhysAddress(MAC_ADDRESS)\r
+ .setIpPrefix(IP_PREFIX)\r
+ .setIpAddress(IP_ADDRESS)\r
+ .setEnabled(true)\r
+ .build();\r
+\r
+ Assert.assertEquals(IS_BVI, addCommand.getBvi());\r
+ Assert.assertEquals(MAC_ADDRESS, addCommand.getPhysAddress());\r
+ Assert.assertEquals(IP_ADDRESS, addCommand.getIpAddress());\r
+ Assert.assertEquals(IP_PREFIX, addCommand.getIpPrefix());\r
+\r
+ Optional<Interface> optional = executeCommand(rwTx, addCommand);\r
+\r
+ Assert.assertTrue(optional.isPresent());\r
+ Assert.assertEquals(BASIC_INTERFACE, optional.get());\r
+\r
+ }\r
+\r
+ @Test\r
+ public void testAddLoopback_WithBridgeDomain() throws ExecutionException, InterruptedException {\r
+ ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+ LoopbackCommand addCommand = LoopbackCommand.builder()\r
+ .setOperation(General.Operations.PUT)\r
+ .setInterfaceName(INTERFACE_NAME)\r
+ .setDescription(DESCRIPTION)\r
+ .setBvi(IS_BVI)\r
+ .setPhysAddress(MAC_ADDRESS)\r
+ .setIpPrefix(IP_PREFIX)\r
+ .setIpAddress(IP_ADDRESS)\r
+ .setBridgeDomain(BRIDGE_DOMAIN)\r
+ .setEnabled(true)\r
+ .build();\r
+\r
+ Assert.assertEquals(BRIDGE_DOMAIN, addCommand.getBridgeDomain());\r
+\r
+ Optional<Interface> optional = executeCommand(rwTx, addCommand);\r
+\r
+ Assert.assertTrue(optional.isPresent());\r
+ Assert.assertEquals(BASIC_INTERFACE_WITH_BD, optional.get());\r
+\r
+ }\r
+\r
+ private Optional<Interface> executeCommand(ReadWriteTransaction rwTx, LoopbackCommand addCommand)\r
+ throws ExecutionException, InterruptedException {\r
+ addCommand.execute(rwTx);\r
+\r
+ rwTx.submit().get();\r
+\r
+ ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+\r
+ return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+ VppIidFactory.getInterfaceIID(new InterfaceKey(INTERFACE_NAME)), rTx);\r
+ }\r
+\r
+ @Test\r
+ public void testDeleteLoopbackPort() throws ExecutionException, InterruptedException {\r
+ ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+\r
+ rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),\r
+ BASIC_INTERFACE, true);\r
+ rwTx.submit().get();\r
+\r
+ Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+ VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());\r
+\r
+ Assert.assertTrue(optional.isPresent());\r
+\r
+ LoopbackCommand deleteCommand = LoopbackCommand.builder()\r
+ .setOperation(General.Operations.DELETE)\r
+ .setInterfaceName(INTERFACE_NAME)\r
+ .build();\r
+\r
+ ReadWriteTransaction rwTxDel = dataBroker.newReadWriteTransaction();\r
+ deleteCommand.execute(rwTxDel);\r
+ rwTxDel.submit();\r
+\r
+ Optional<Interface> optionalDeleted = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+ VppIidFactory.getInterfaceIID(new InterfaceKey(deleteCommand.getName())),\r
+ dataBroker.newReadOnlyTransaction());\r
+\r
+ Assert.assertFalse(optionalDeleted.isPresent());\r
+ }\r
+\r
+ @Test\r
+ public void testUpdateLoopbackPort() throws ExecutionException, InterruptedException {\r
+ ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+\r
+ rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),\r
+ BASIC_INTERFACE, true);\r
+ rwTx.submit().get();\r
+\r
+ Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+ VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());\r
+\r
+ Assert.assertTrue(optional.isPresent());\r
+\r
+ LoopbackCommand updateCommand = LoopbackCommand.builder()\r
+ .setOperation(General.Operations.MERGE)\r
+ .setInterfaceName(INTERFACE_NAME)\r
+ .setDescription(UPD_DESCRIPTION)\r
+ .setPhysAddress(UPD_MAC_ADDRESS)\r
+ .setIpPrefix(UPD_IP_PREFIX)\r
+ .setIpAddress(UPD_IP_ADDRESS)\r
+ .setEnabled(false)\r
+ .build();\r
+\r
+ ReadWriteTransaction rwTxUpd = dataBroker.newReadWriteTransaction();\r
+ updateCommand.execute(rwTxUpd);\r
+ rwTxUpd.submit().get();\r
+\r
+ Optional<Interface> optionalUpdated = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+ VppIidFactory.getInterfaceIID(new InterfaceKey(updateCommand.getName())),\r
+ dataBroker.newReadOnlyTransaction());\r
+\r
+ Assert.assertTrue(optionalUpdated.isPresent());\r
+ Interface updatedInterface = optionalUpdated.get();\r
+\r
+ Assert.assertEquals(UPD_DESCRIPTION, updatedInterface.getDescription());\r
+ Assert.assertFalse(updatedInterface.isEnabled());\r
+ VppInterfaceAugmentation augmentation = updatedInterface.getAugmentation(VppInterfaceAugmentation.class);\r
+ Assert.assertEquals(INTERFACE_NAME, updatedInterface.getName());\r
+ Assert.assertEquals(UPD_MAC_ADDRESS, augmentation.getLoopback().getMac());\r
+ Interface1 interface1 = updatedInterface.getAugmentation(Interface1.class);\r
+\r
+ // merge operation will add new ip address to list so index is 1 for new ip\r
+ String ip = interface1.getIpv4().getAddress().get(1).getIp().getValue();\r
+ Subnet subnet = interface1.getIpv4().getAddress().get(1).getSubnet();\r
+ String prefix = "";\r
+\r
+ if ( subnet instanceof PrefixLength){\r
+ prefix = ((PrefixLength) subnet).getPrefixLength().toString();\r
+ }\r
+ IpPrefix ipPrefix = new IpPrefix(new Ipv4Prefix(ip + "/" + prefix));\r
+ IpAddress ipAddress = new IpAddress( new Ipv4Address(ip));\r
+ Assert.assertEquals(UPD_IP_PREFIX, ipPrefix);\r
+ Assert.assertEquals(UPD_IP_ADDRESS, ipAddress);\r
+ }\r
+}\r