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