2 * Copyright (c) 2017 Cisco Systems. All rights reserved.
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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.dhcp;
11 import com.google.common.base.Optional;
12 import com.google.common.collect.HashMultimap;
13 import com.google.common.collect.SetMultimap;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.Mockito;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;
22 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.DhcpRelayCommand;
23 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
24 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
25 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
26 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2BridgeDomain;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.MacAddressType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.has.subnet.Subnet;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.has.subnet.SubnetBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.ConfigBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.TapCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.Ipv4;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.dhcp.attributes.relays.Relay;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.dhcp.attributes.relays.RelayBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.dhcp.attributes.relays.RelayKey;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.relay.attributes.Server;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.dhcp.rev170315.relay.attributes.ServerBuilder;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import java.util.Collections;
51 import java.util.List;
52 import java.util.concurrent.ExecutionException;
54 public class DhcpRelayHandlerTest extends VppRendererDataBrokerTest {
56 public static final String TEST_BD = "testBD";
57 public static final NodeId TEST_NODE = new NodeId("testNode");
58 private static final long RX_VRF_ID = 0L;
59 private static final SetMultimap<String, NodeId> vppNodesByL2Fd = HashMultimap.create();
60 private static final String TEST_L2_CONTEXT_ID = "53064b9c-6dfa-40cd-81aa-02c88289e363";
61 private static final IpAddress GATEWAY_IP_ADDRESS = new IpAddress(new Ipv4Address("10.0.0.1"));
62 private static final IpAddress SERVER_IP_ADDRESS = new IpAddress(new Ipv4Address("10.0.0.2"));
63 private static final String SERVER_MAC_ADDRESS = "fa:16:3e:a1:c5:c3";
64 public static final List<Server> SERVER_LIST_1 =
65 Collections.singletonList(new ServerBuilder().setVrfId(RX_VRF_ID).setAddress(SERVER_IP_ADDRESS).build());
66 public static final DhcpRelayCommand DHCP_RELAY_COMMAND =
67 DhcpRelayCommand.builder().setAddressType(Ipv4.class)
68 .setGatewayIpAddress(GATEWAY_IP_ADDRESS)
69 .setServerIpAddresses(SERVER_LIST_1)
70 .setOperation(General.Operations.PUT)
71 .setRxVrfId(RX_VRF_ID)
73 private static final VppEndpoint VPP_ENDPOINT = new VppEndpointBuilder()
74 .setAddressType(MacAddressType.class)
75 .setAddress(SERVER_MAC_ADDRESS)
76 .setContextType(L2BridgeDomain.class)
77 .setContextId(new ContextId(TEST_L2_CONTEXT_ID))
78 .setInterfaceTypeChoice(new TapCaseBuilder().setDhcpServerAddress(SERVER_IP_ADDRESS).build())
79 .setVppNodeId(TEST_NODE)
81 private static final Config VPP_RENDERER_CONFIG =
82 new ConfigBuilder().setVppEndpoint(Collections.singletonList(VPP_ENDPOINT)).build();
83 private static final Relay RELAY = new RelayBuilder()
84 .setAddressType(Ipv4.class)
85 .setGatewayAddress(GATEWAY_IP_ADDRESS)
86 .setServer(SERVER_LIST_1)
87 .setRxVrfId(RX_VRF_ID)
89 private static final Subnet
90 subnet = new SubnetBuilder()
91 .setDefaultSubnetGatewayIp(GATEWAY_IP_ADDRESS)
92 .setIpPrefix(new IpPrefix(Ipv4Prefix.getDefaultInstance("10.0.0.2/24")))
94 private DataBroker dataBroker;
95 private MountedDataBrokerProvider mountedDataProviderMock;
98 public void init() throws ExecutionException, InterruptedException {
99 dataBroker = getDataBroker();
100 mountedDataProviderMock = Mockito.mock(MountedDataBrokerProvider.class);
101 vppNodesByL2Fd.put(TEST_BD, TEST_NODE);
102 Mockito.when(mountedDataProviderMock.getDataBrokerForMountPoint(Mockito.any(InstanceIdentifier.class)))
103 .thenReturn(Optional.of(dataBroker));
104 writeBasicDhcpVppEp();
108 public void createIpv4DhcpRelayTest() throws ExecutionException, InterruptedException {
109 DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
111 dhcpRelayHandler.createIpv4DhcpRelay(RX_VRF_ID, subnet, vppNodesByL2Fd);
112 Optional<Relay> relayOptional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
113 VppIidFactory.getDhcpRelayIid(DHCP_RELAY_COMMAND.getDhcpBuilder().getKey()),
114 dataBroker.newReadOnlyTransaction());
115 Assert.assertTrue(relayOptional.isPresent());
116 Assert.assertEquals(RELAY, relayOptional.get());
120 public void createIpv4DhcpRelayTestWithNullServerIp() throws ExecutionException, InterruptedException {
121 DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
123 Subnet subnet1 = new SubnetBuilder(subnet).setDefaultSubnetGatewayIp(null).build();
125 dhcpRelayHandler.createIpv4DhcpRelay(RX_VRF_ID, subnet1, vppNodesByL2Fd);
126 Optional<Relay> relayOptional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
127 VppIidFactory.getDhcpRelayIid(DHCP_RELAY_COMMAND.getDhcpBuilder().getKey()),
128 dataBroker.newReadOnlyTransaction());
129 Assert.assertFalse(relayOptional.isPresent());
133 public void deleteIpv4DhcpRelayTest() throws ExecutionException, InterruptedException {
134 DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
137 Optional<Relay> relayOptional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
138 VppIidFactory.getDhcpRelayIid(DHCP_RELAY_COMMAND.getDhcpBuilder().getKey()),
139 dataBroker.newReadOnlyTransaction());
140 Assert.assertTrue(relayOptional.isPresent());
141 Assert.assertEquals(RELAY, relayOptional.get());
143 dhcpRelayHandler.deleteIpv4DhcpRelay(RX_VRF_ID, subnet, vppNodesByL2Fd);
144 relayOptional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
145 VppIidFactory.getDhcpRelayIid(DHCP_RELAY_COMMAND.getDhcpBuilder().getKey()),
146 dataBroker.newReadOnlyTransaction());
147 Assert.assertFalse(relayOptional.isPresent());
150 private Optional<Relay> writeBasicRelay() throws InterruptedException, ExecutionException {
151 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
152 rwTx.put(LogicalDatastoreType.CONFIGURATION,
153 VppIidFactory.getDhcpRelayIid(new RelayKey(Ipv4.class, RX_VRF_ID)), RELAY, true);
156 return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
157 VppIidFactory.getDhcpRelayIid(new RelayKey(Ipv4.class, RX_VRF_ID)),
158 dataBroker.newReadOnlyTransaction());
161 private Optional<Config> writeBasicDhcpVppEp() throws InterruptedException, ExecutionException {
162 ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
163 rwTx.put(LogicalDatastoreType.CONFIGURATION,
164 VppIidFactory.getVppRendererConfig(), VPP_RENDERER_CONFIG, true);
167 return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getVppRendererConfig(),
168 dataBroker.newReadOnlyTransaction());