aef313c94d85eac985455f3b83d43f301e9e66ca
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / dhcp / DhcpRelayHandlerTest.java
1 /*
2  * Copyright (c) 2017 Cisco Systems. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.dhcp;
10
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;
49
50 import java.util.Collections;
51 import java.util.List;
52 import java.util.concurrent.ExecutionException;
53
54 public class DhcpRelayHandlerTest extends VppRendererDataBrokerTest {
55
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)
72             .build();
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)
80         .build();
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)
88         .build();
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")))
93         .build();
94     private DataBroker dataBroker;
95     private MountedDataBrokerProvider mountedDataProviderMock;
96
97     @Before
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();
105     }
106
107     @Test
108     public void createIpv4DhcpRelayTest() throws ExecutionException, InterruptedException {
109         DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
110
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());
117     }
118
119     @Test
120     public void createIpv4DhcpRelayTestWithNullServerIp() throws ExecutionException, InterruptedException {
121         DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
122
123         Subnet subnet1 = new SubnetBuilder(subnet).setDefaultSubnetGatewayIp(null).build();
124
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());
130     }
131
132     @Test
133     public void deleteIpv4DhcpRelayTest() throws ExecutionException, InterruptedException {
134         DhcpRelayHandler dhcpRelayHandler = new DhcpRelayHandler(dataBroker, mountedDataProviderMock);
135         writeBasicRelay();
136
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());
142
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());
148     }
149
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);
154         rwTx.submit().get();
155
156         return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
157             VppIidFactory.getDhcpRelayIid(new RelayKey(Ipv4.class, RX_VRF_ID)),
158             dataBroker.newReadOnlyTransaction());
159     }
160
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);
165         rwTx.submit().get();
166
167         return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getVppRendererConfig(),
168             dataBroker.newReadOnlyTransaction());
169     }
170 }