Cleanup of Lisp in VPP renderer
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / iface / InterfaceManagerTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. 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.iface;
10
11 import java.util.AbstractMap;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.concurrent.locks.ReentrantLock;
16
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.ReadOnlyTransaction;
23 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
24 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
25 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent;
26 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.flat.overlay.FlatOverlayManager;
27 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
28 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
29 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
30 import org.opendaylight.groupbasedpolicy.util.IidFactory;
31 import org.opendaylight.vbd.impl.transaction.VbdNetconfTransaction;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpoint;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.LocationProviders;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.location.providers.LocationProvider;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.location.providers.location.provider.ProviderAddressEndpointLocation;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.IpPrefixType;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2BridgeDomain;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L3Context;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.MacAddressType;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.AddressType;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.BridgeDomains;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VhostUser;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VhostUserRole;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VppInterfaceAugmentation;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev170816._interface.nat.attributes.Nat;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65
66 import com.google.common.base.Optional;
67 import com.google.common.collect.ImmutableList;
68 import com.google.common.collect.Lists;
69
70 public class InterfaceManagerTest extends CustomDataBrokerTest {
71
72     private final static String ADDRESS = "1.1.1.1/32";
73     private final static String MAC_ADDRESS = "00:11:22:33:44:55:66";
74     private final static ContextId CONTEXT_ID = new ContextId("ctx1");
75     private final static String IFACE_NAME = "ifaceName1";
76     private final static VppEndpointKey BASIC_VPP_EP_KEY =
77             new VppEndpointKey(ADDRESS, AddressType.class, CONTEXT_ID, ContextType.class);
78     private final static InstanceIdentifier<VppEndpoint> BASIC_VPP_EP_IID =
79             InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, BASIC_VPP_EP_KEY).build();
80     private final static NodeKey NODE_KEY = new NodeKey(new NodeId("node1"));
81     private final static String SOCKET = "socket1";
82     private final static String TENANT = "tenant";
83
84     private InterfaceManager manager;
85     private FlatOverlayManager flatOverlayManager;
86     private MountedDataBrokerProvider mountedDataProviderMock;
87     private DataBroker mountPointDataBroker;
88     private DataBroker dataBroker;
89
90     @Override
91     public Collection<Class<?>> getClassesFromModules() {
92         return Arrays.asList(Node.class, VppEndpoint.class, Interfaces.class, BridgeDomains.class,
93                 LocationProviders.class, IpPrefixType.class, MacAddressType.class, Nat.class);
94     }
95
96     @Before
97     public void init() throws Exception {
98         mountedDataProviderMock = Mockito.mock(MountedDataBrokerProvider.class);
99         flatOverlayManager = Mockito.mock(FlatOverlayManager.class);
100         mountPointDataBroker = getDataBroker();
101         setup(); // initialize new data broker for ODL data store
102         dataBroker = getDataBroker();
103         Mockito.when(mountedDataProviderMock.resolveDataBrokerForMountPoint(Mockito.any(InstanceIdentifier.class)))
104             .thenReturn(Optional.of(mountPointDataBroker));
105         manager = new InterfaceManager(mountedDataProviderMock, dataBroker);
106     }
107
108     @Test
109     public void testVppEndpointChanged_created() throws Exception {
110         AddressEndpoint addrEp = new AddressEndpointBuilder()
111             .setKey(new AddressEndpointKey("1.1.1.1/32", IpPrefixType.class, CONTEXT_ID, L3Context.class))
112             .setChildEndpoint(Lists.newArrayList(new ChildEndpointBuilder()
113                 .setKey(new ChildEndpointKey(vhostVppEpBuilder().getAddress(), vhostVppEpBuilder().getAddressType(),
114                         vhostVppEpBuilder().getContextId(), vhostVppEpBuilder().getContextType()))
115                 .build()))
116             .setEndpointGroup(ImmutableList.of())
117             .setTenant(new TenantId(TENANT))
118             .build();
119         VppEndpointLocationProvider vppEpLocProvider = new VppEndpointLocationProvider(dataBroker);
120         WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
121         wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.addressEndpointIid(addrEp.getKey()), addrEp, true);
122         wTx.submit().get();
123         VppEndpoint vhostEp = vhostVppEpBuilder().build();
124         VppEndpointConfEvent event = new VppEndpointConfEvent(BASIC_VPP_EP_IID, null, vhostEp);
125         VbdNetconfTransaction.NODE_DATA_BROKER_MAP.put(VppIidFactory.getNetconfNodeIid(vhostEp.getVppNodeId()),
126                 new AbstractMap.SimpleEntry<DataBroker, ReentrantLock>(mountPointDataBroker, new ReentrantLock()));
127         manager.vppEndpointChanged(event);
128         // assert state on data store behind mount point
129         ReadOnlyTransaction rTxMount = mountPointDataBroker.newReadOnlyTransaction();
130         Optional<Interface> potentialIface =
131                 rTxMount.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Interfaces.class)
132                     .child(Interface.class, new InterfaceKey(vhostEp.getVppInterfaceName()))
133                     .build()).get();
134         Assert.assertTrue(potentialIface.isPresent());
135         Interface iface = potentialIface.get();
136         Assert.assertEquals(VhostUser.class, iface.getType());
137         Assert.assertTrue(iface.isEnabled());
138         VppInterfaceAugmentation vppIface = iface.getAugmentation(VppInterfaceAugmentation.class);
139         Assert.assertNotNull(vppIface);
140         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.interfaces._interface.VhostUser vhostUserIface =
141                 vppIface.getVhostUser();
142         Assert.assertNotNull(vhostUserIface);
143         Assert.assertEquals(VhostUserRole.Client, vhostUserIface.getRole());
144         Assert.assertEquals(SOCKET, vhostUserIface.getSocket());
145         Assert.assertNull(vppIface.getL2()); // TODO test case for adding interface to BD
146         // assert state on ODL data store
147         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
148         Optional<LocationProvider> optLocationProvider = rTx.read(LogicalDatastoreType.CONFIGURATION,
149                 IidFactory.locationProviderIid(VppEndpointLocationProvider.VPP_ENDPOINT_LOCATION_PROVIDER))
150             .get();
151         Assert.assertTrue(optLocationProvider.isPresent());
152         List<ProviderAddressEndpointLocation> epLocs = optLocationProvider.get().getProviderAddressEndpointLocation();
153         Assert.assertNotNull(epLocs);
154         Assert.assertEquals(1, epLocs.size());
155         vppEpLocProvider.close();
156     }
157
158     @Test
159     public void testVppEndpointChanged_deleted() throws Exception {
160         VppEndpoint vhostEp = vhostVppEpBuilder().build();
161         VppEndpointConfEvent createVppEpEvent = new VppEndpointConfEvent(BASIC_VPP_EP_IID, null, vhostEp);
162         VppEndpointConfEvent deleteVppEpEvent = new VppEndpointConfEvent(BASIC_VPP_EP_IID, vhostEp, null);
163         VbdNetconfTransaction.NODE_DATA_BROKER_MAP.put(VppIidFactory.getNetconfNodeIid(vhostEp.getVppNodeId()),
164                 new AbstractMap.SimpleEntry<DataBroker, ReentrantLock>(mountPointDataBroker, new ReentrantLock()));
165         manager.vppEndpointChanged(createVppEpEvent);
166         manager.vppEndpointChanged(deleteVppEpEvent);
167         // assert state on data store behind mount point
168         ReadOnlyTransaction rTxMount = mountPointDataBroker.newReadOnlyTransaction();
169         Optional<Interface> potentialIface =
170                 rTxMount.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Interfaces.class)
171                     .child(Interface.class, new InterfaceKey(vhostEp.getVppInterfaceName()))
172                     .build()).get();
173         Assert.assertFalse(potentialIface.isPresent());
174         // assert state on ODL data store
175         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
176         VppLocationUtils.createProviderAddressEndpointLocationKey(vhostEp);
177         InstanceIdentifier<ProviderAddressEndpointLocation> providerAddressEndpointLocationIid =
178                 IidFactory.locationProviderIid(VppEndpointLocationProvider.VPP_ENDPOINT_LOCATION_PROVIDER,
179                         VppLocationUtils.createProviderAddressEndpointLocationKey(vhostEp));
180         Optional<ProviderAddressEndpointLocation> optProvEpLoc =
181                 rTx.read(LogicalDatastoreType.CONFIGURATION, providerAddressEndpointLocationIid).get();
182         Assert.assertFalse(optProvEpLoc.isPresent());
183     }
184
185     private VppEndpointBuilder vhostVppEpBuilder() {
186         return basicVppEpBuilder().setVppInterfaceName(IFACE_NAME)
187             .setVppNodeId(NODE_KEY.getNodeId())
188             .setInterfaceTypeChoice(new VhostUserCaseBuilder().setSocket(SOCKET).build());
189     }
190
191     private VppEndpointBuilder basicVppEpBuilder() {
192         return new VppEndpointBuilder().setAddress(MAC_ADDRESS)
193             .setAddressType(MacAddressType.class)
194             .setContextId(CONTEXT_ID)
195             .setContextType(L2BridgeDomain.class);
196     }
197 }