/*
* Copyright (c) 2016 Cisco Systems. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
import com.google.common.base.Optional;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1Builder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.RouteBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.VppIpv4RouteBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.SimpleNextHopBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Static;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocol;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolKey;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutesBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttr;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttrBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.VniReference;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.routing.routing.instance.routing.protocols.routing.protocol.VppProtocolAttributesBuilder;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class RoutingCommandTest extends VppRendererDataBrokerTest {
private final static String NEXT_HOP = "10.0.0.1";
private final static String OUT_INTERFACE = "GigabitEthernet0/a/0";
private final static String PREFIX = "10.0.0.0/24";
private final static String PREFIX_2 = "0.0.0.0/0";
private final static String ROUTER_PROTOCOL = "vpp-routing-protocol_0";
private final static String ROUTE1_DESCRIPTION = "route 1";
private final static String ROUTE2_DESCRIPTION = "route 2";
private final static VniReference VNI_REFERENCE = new VniReference(0L);
private final static Route
ROUTE_1 =
new RouteBuilder().setId(1L)
.setDescription(ROUTE1_DESCRIPTION)
.setDestinationPrefix(new Ipv4Prefix(PREFIX))
.setNextHopOptions(new SimpleNextHopBuilder().setNextHop(new Ipv4Address(NEXT_HOP))
.setOutgoingInterface(OUT_INTERFACE)
.build())
.setVppIpv4Route(new VppIpv4RouteBuilder().setClassifyTable("0").setSecondaryVrf(VNI_REFERENCE).build())
.build();
private final static Route
ROUTE_2 =
new RouteBuilder().setId(2L)
.setDescription(ROUTE2_DESCRIPTION)
.setDestinationPrefix(new Ipv4Prefix(PREFIX_2))
.setNextHopOptions(new SimpleNextHopBuilder().setNextHop(new Ipv4Address(NEXT_HOP))
.setOutgoingInterface(OUT_INTERFACE)
.build())
.setVppIpv4Route(new VppIpv4RouteBuilder().setClassifyTable("0").setSecondaryVrf(VNI_REFERENCE).build())
.build();
private final static List<Route> ROUTES = Collections.singletonList(ROUTE_1);
private final static List<Route> ROUTES2 = Collections.singletonList(ROUTE_2);
private final static RoutingProtocol ROUTING_PROTOCOL = new RoutingProtocolBuilder()
.setEnabled(true)
.setType(Static.class)
.setName(ROUTER_PROTOCOL)
.addAugmentation(RoutingProtocolVppAttr.class, new RoutingProtocolVppAttrBuilder().setVppProtocolAttributes(
new VppProtocolAttributesBuilder().setPrimaryVrf(VNI_REFERENCE).build()).build())
.setStaticRoutes(new StaticRoutesBuilder().addAugmentation(StaticRoutes1.class,
new StaticRoutes1Builder().setIpv4(new Ipv4Builder().setRoute(ROUTES).build()).build()).build())
.build();
private DataBroker dataBroker;
@Before
public void init() {
dataBroker = getDataBroker();
}
@Test
public void addRoutingCommandTest() throws ExecutionException, InterruptedException {
ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
RoutingCommand
routingCommand =
RoutingCommand.builder()
.setOperation(General.Operations.PUT)
.setRouterProtocol(ROUTER_PROTOCOL)
.setRoutes(ROUTES)
.setVrfId(VNI_REFERENCE.getValue())
.build();
Assert.assertEquals(General.Operations.PUT, routingCommand.getOperation());
Assert.assertEquals(ROUTER_PROTOCOL, routingCommand.getRouterProtocol());
Assert.assertEquals(VNI_REFERENCE.getValue(), routingCommand.getVrfId());
Assert.assertEquals(ROUTES, routingCommand.getRoutes());
Optional<RoutingProtocol> routingProtocolOptional = executeCommand(rwTx, routingCommand);
Assert.assertTrue(routingProtocolOptional.isPresent());
Assert.assertEquals(ROUTING_PROTOCOL, routingProtocolOptional.get());
}
@Test
public void removeRoutingCommandTest() throws ExecutionException, InterruptedException {
Optional<RoutingProtocol> optional = writeBasicRoutingProtocol();
ReadWriteTransaction rwTx;
Assert.assertTrue(optional.isPresent());
rwTx = dataBroker.newReadWriteTransaction();
RoutingCommand routingCommand =
RoutingCommand.builder()
.setOperation(General.Operations.DELETE)
.setRouterProtocol(ROUTER_PROTOCOL)
.setVrfId(VNI_REFERENCE.getValue())
.build();
routingCommand.execute(rwTx);
rwTx.submit();
optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routingCommand.getRouterProtocol())),
dataBroker.newReadOnlyTransaction());
Assert.assertFalse(optional.isPresent());
}
@Test
public void mergeRoutingCommandTest() throws ExecutionException, InterruptedException {
Optional<RoutingProtocol> optional = writeBasicRoutingProtocol();
ReadWriteTransaction rwTx;
Assert.assertTrue(optional.isPresent());
rwTx = dataBroker.newReadWriteTransaction();
RoutingCommand
routingCommand =
RoutingCommand.builder()
.setOperation(General.Operations.MERGE)
.setRouterProtocol(ROUTER_PROTOCOL)
.setRoutes(ROUTES2)
.setVrfId(VNI_REFERENCE.getValue())
.build();
routingCommand.execute(rwTx);
rwTx.submit();
optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routingCommand.getRouterProtocol())),
dataBroker.newReadOnlyTransaction());
Assert.assertTrue(optional.isPresent());
RoutingProtocol routingProtocol = optional.get();
StaticRoutes1 staticRoutes1 = routingProtocol.getStaticRoutes().getAugmentation(StaticRoutes1.class);
Assert.assertTrue(staticRoutes1.getIpv4().getRoute().contains(ROUTE_1));
Assert.assertTrue(staticRoutes1.getIpv4().getRoute().contains(ROUTE_2));
}
private Optional<RoutingProtocol> writeBasicRoutingProtocol() throws InterruptedException, ExecutionException {
ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
rwTx.put(LogicalDatastoreType.CONFIGURATION,
VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(ROUTER_PROTOCOL)), ROUTING_PROTOCOL, true);
rwTx.submit().get();
return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(ROUTER_PROTOCOL)),
dataBroker.newReadOnlyTransaction());
}
private Optional<RoutingProtocol> executeCommand(ReadWriteTransaction rwTx, RoutingCommand routingCommand)
throws ExecutionException, InterruptedException {
routingCommand.execute(rwTx);
rwTx.submit().get();
ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routingCommand.getRouterProtocol())), rTx);
}
}