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