2 * Copyright (c) 2016 Cisco Systems, Inc. and others. 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.iface;
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;
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.common.rev140421.ContextId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.LocationProviders;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.location.providers.LocationProvider;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.location.providers.location.provider.ProviderAddressEndpointLocation;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.AddressType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425._interface.attributes._interface.type.choice.VhostUserCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.BridgeDomains;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VhostUser;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VhostUserRole;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.VppInterfaceAugmentation;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
56 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import com.google.common.base.Optional;
59 import com.google.common.collect.ImmutableList;
61 public class InterfaceManagerTest extends CustomDataBrokerTest {
63 private final static String ADDRESS = "1.1.1.1/32";
64 private final static ContextId CONTEXT_ID = new ContextId("ctx1");
65 private final static String IFACE_NAME = "ifaceName1";
66 private final static VppEndpointKey BASIC_VPP_EP_KEY =
67 new VppEndpointKey(ADDRESS, AddressType.class, CONTEXT_ID, ContextType.class);
68 private final static InstanceIdentifier<VppEndpoint> BASIC_VPP_EP_IID =
69 InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, BASIC_VPP_EP_KEY).build();
70 private final static NodeKey NODE_KEY = new NodeKey(new NodeId("node1"));
71 private final static String SOCKET = "socket1";
73 private InterfaceManager manager;
74 private FlatOverlayManager flatOverlayManager;
75 private MountedDataBrokerProvider mountedDataProviderMock;
76 private DataBroker mountPointDataBroker;
77 private DataBroker dataBroker;
80 public Collection<Class<?>> getClassesFromModules() {
81 return Arrays.asList(Node.class, VppEndpoint.class, Interfaces.class, BridgeDomains.class,
82 LocationProviders.class);
86 public void init() throws Exception {
87 mountedDataProviderMock = Mockito.mock(MountedDataBrokerProvider.class);
88 flatOverlayManager = Mockito.mock(FlatOverlayManager.class);
89 mountPointDataBroker = getDataBroker();
90 setup(); // initialize new data broker for ODL data store
91 dataBroker = getDataBroker();
92 Mockito.when(mountedDataProviderMock.resolveDataBrokerForMountPoint(Mockito.any(InstanceIdentifier.class)))
93 .thenReturn(Optional.of(mountPointDataBroker));
94 manager = new InterfaceManager(mountedDataProviderMock, dataBroker, flatOverlayManager);
98 public void testVppEndpointChanged_created() throws Exception {
99 AddressEndpoint addrEp = new AddressEndpointBuilder()
100 .setKey(new AddressEndpointKey(vhostVppEpBuilder().getAddress(), vhostVppEpBuilder().getAddressType(),
101 vhostVppEpBuilder().getContextId(), vhostVppEpBuilder().getContextType()))
102 .setEndpointGroup(ImmutableList.of())
104 VppEndpointLocationProvider vppEpLocProvider = new VppEndpointLocationProvider(dataBroker);
105 WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
106 wTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.addressEndpointIid(addrEp.getKey()), addrEp, true);
108 VppEndpoint vhostEp = vhostVppEpBuilder().build();
109 VppEndpointConfEvent event = new VppEndpointConfEvent(BASIC_VPP_EP_IID, null, vhostEp);
110 VbdNetconfTransaction.NODE_DATA_BROKER_MAP.put(VppIidFactory.getNetconfNodeIid(vhostEp.getVppNodeId()),
111 new AbstractMap.SimpleEntry(mountPointDataBroker, new ReentrantLock()));
112 manager.vppEndpointChanged(event);
113 // assert state on data store behind mount point
114 ReadOnlyTransaction rTxMount = mountPointDataBroker.newReadOnlyTransaction();
115 Optional<Interface> potentialIface =
116 rTxMount.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Interfaces.class)
117 .child(Interface.class, new InterfaceKey(vhostEp.getVppInterfaceName()))
119 Assert.assertTrue(potentialIface.isPresent());
120 Interface iface = potentialIface.get();
121 Assert.assertEquals(VhostUser.class, iface.getType());
122 Assert.assertTrue(iface.isEnabled());
123 VppInterfaceAugmentation vppIface = iface.getAugmentation(VppInterfaceAugmentation.class);
124 Assert.assertNotNull(vppIface);
125 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev170607.interfaces._interface.VhostUser vhostUserIface =
126 vppIface.getVhostUser();
127 Assert.assertNotNull(vhostUserIface);
128 Assert.assertEquals(VhostUserRole.Client, vhostUserIface.getRole());
129 Assert.assertEquals(SOCKET, vhostUserIface.getSocket());
130 Assert.assertNull(vppIface.getL2()); //TODO test case for adding interface to BD
131 // assert state on ODL data store
132 ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
133 Optional<LocationProvider> optLocationProvider = rTx.read(LogicalDatastoreType.CONFIGURATION, IidFactory.locationProviderIid(VppEndpointLocationProvider.VPP_ENDPOINT_LOCATION_PROVIDER)).get();
134 Assert.assertTrue(optLocationProvider.isPresent());
135 List<ProviderAddressEndpointLocation> epLocs = optLocationProvider.get().getProviderAddressEndpointLocation();
136 Assert.assertNotNull(epLocs);
137 Assert.assertEquals(1, epLocs.size());
138 vppEpLocProvider.close();
142 public void testVppEndpointChanged_deleted() throws Exception {
143 VppEndpoint vhostEp = vhostVppEpBuilder().build();
144 VppEndpointConfEvent createVppEpEvent = new VppEndpointConfEvent(BASIC_VPP_EP_IID, null, vhostEp);
145 VppEndpointConfEvent deleteVppEpEvent = new VppEndpointConfEvent(BASIC_VPP_EP_IID, vhostEp, null);
146 VbdNetconfTransaction.NODE_DATA_BROKER_MAP.put(VppIidFactory.getNetconfNodeIid(vhostEp.getVppNodeId()),
147 new AbstractMap.SimpleEntry(mountPointDataBroker, new ReentrantLock()));
148 manager.vppEndpointChanged(createVppEpEvent);
149 manager.vppEndpointChanged(deleteVppEpEvent);
150 // assert state on data store behind mount point
151 ReadOnlyTransaction rTxMount = mountPointDataBroker.newReadOnlyTransaction();
152 Optional<Interface> potentialIface =
153 rTxMount.read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Interfaces.class)
154 .child(Interface.class, new InterfaceKey(vhostEp.getVppInterfaceName()))
156 Assert.assertFalse(potentialIface.isPresent());
157 // assert state on ODL data store
158 ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
159 VppLocationUtils.createProviderAddressEndpointLocationKey(vhostEp);
160 InstanceIdentifier<ProviderAddressEndpointLocation> providerAddressEndpointLocationIid = IidFactory
161 .providerAddressEndpointLocationIid(VppEndpointLocationProvider.VPP_ENDPOINT_LOCATION_PROVIDER,
162 VppLocationUtils.createProviderAddressEndpointLocationKey(vhostEp));
163 Optional<ProviderAddressEndpointLocation> optProvEpLoc =
164 rTx.read(LogicalDatastoreType.CONFIGURATION, providerAddressEndpointLocationIid).get();
165 Assert.assertFalse(optProvEpLoc.isPresent());
168 private VppEndpointBuilder vhostVppEpBuilder() {
169 return basicVppEpBuilder().setVppInterfaceName(IFACE_NAME)
170 .setVppNodeId(NODE_KEY.getNodeId())
171 .setInterfaceTypeChoice(new VhostUserCaseBuilder().setSocket(SOCKET).build());
174 private VppEndpointBuilder basicVppEpBuilder() {
175 return new VppEndpointBuilder().setAddress(ADDRESS)
176 .setAddressType(AddressType.class)
177 .setContextId(CONTEXT_ID)
178 .setContextType(ContextType.class);