2 * Copyright (c) 2015 - 2016 HPE 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
8 package org.opendaylight.netvirt.neutronvpn;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.fail;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Mockito.doAnswer;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.when;
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.Futures;
20 import java.math.BigInteger;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.List;
24 import org.junit.After;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.Mock;
29 import org.mockito.invocation.InvocationOnMock;
30 import org.mockito.runners.MockitoJUnitRunner;
31 import org.mockito.stubbing.Answer;
32 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
33 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
34 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
35 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
36 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
37 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnList;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnListBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.router.dpn.list.DpnVpninterfacesList;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.router.dpn.list.DpnVpninterfacesListBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentationBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsBuilder;
81 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
82 import org.opendaylight.yangtools.concepts.ListenerRegistration;
83 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
85 @RunWith(MockitoJUnitRunner.class)
86 public class ToTransportZoneTest {
88 private static final String PHYS_PORT_NAME = "tap12345-67";
89 private static final Long DPN_ID = 1234567890L;
90 private static final BigInteger DPN_ID_2 = BigInteger.valueOf(1234567891L);
91 private static final String PORT_NAME = "12345678-1234-1234-1234-123456789012";
92 private static final String PORT_IP = "1.1.1.1";
93 private static final String NETWORK_ID = "12345678-1234-1234-1234-123456789012";
94 private static final String SUBNET = "0.0.0.0/0";
95 private static final String OVS_IP = "10.0.0.1";
96 private static final IpAddress OVS_IP_2 = new IpAddress("10.0.0.2".toCharArray());
97 private static final String VTEP_PORT = "tunnel_port";
98 private static final String ROUTER_ID = "10345678-1234-1234-1234-123456789012";
101 private DataBroker dataBroker;
103 private NeutronvpnManager neutronvpnManager;
105 private ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
107 private WriteTransaction mockWriteTx;
109 private ReadOnlyTransaction mockReadTx;
112 private Interfaces interf;
114 private List<Vteps> expectedVteps = new ArrayList<>();
115 InterfaceStateToTransportZoneListener interfaceStateToTransportZoneChangeListener;
116 NeutronRouterDpnsToTransportZoneListener neutronRouterDpnsToTransportZoneListener;
117 private Network network;
120 public void setUp() {
121 when(dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), //
122 any(InstanceIdentifier.class), //
123 any(DataChangeListener.class), //
124 any(AsyncDataBroker.DataChangeScope.class))). //
125 thenReturn(dataChangeListenerRegistration);
126 doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction();
127 doAnswer(new Answer<Void>() {
129 public Void answer(InvocationOnMock invocation) throws Throwable {
133 }).when(mockWriteTx).put(any(), any(), any(), any(Boolean.class));
134 doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit();
135 doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
137 Subnetmap subnetMap = new SubnetmapBuilder().setSubnetIp(SUBNET).build();
139 when(neutronvpnManager.updateSubnetmapNodeWithPorts(any(Uuid.class), any(Uuid.class), any(Uuid.class)))
140 .thenReturn(subnetMap);
142 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
143 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
144 interfaceStateToTransportZoneChangeListener =
145 new InterfaceStateToTransportZoneListener(dataBroker, neutronvpnManager);
146 neutronRouterDpnsToTransportZoneListener =
147 new NeutronRouterDpnsToTransportZoneListener(dataBroker, neutronvpnManager);
151 public void afterTestCleanup() {
152 expectedVteps.clear();
156 public void addInterfaceState_FirstTZ() throws Exception {
157 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
158 .Interface> interfaces = new ArrayList<>();
159 interfaces.add(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
160 .interfaces.InterfaceBuilder().setName(PORT_NAME)
161 .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build())
163 interf = new InterfacesBuilder().setInterface(interfaces).build();
164 port = buildPort(PORT_IP);
166 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
167 .thenReturn(Futures.immediateCheckedFuture(Optional.of(interf)))
168 .thenReturn(Futures.immediateCheckedFuture(Optional.of(port)))
169 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()))
170 .thenReturn(Futures.immediateCheckedFuture(Optional.of(getBridgeRefForNode())))
171 .thenReturn(Futures.immediateCheckedFuture(Optional.of(node)))
172 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
173 InterfaceBuilder intBuilder = new InterfaceBuilder();
174 intBuilder.setName(PHYS_PORT_NAME);
175 intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:" + DPN_ID})));
176 //NetworkId(new Uuid("12345678-1234-1234-1234-123456789012"));
177 expectedVteps.add(buildVtep(BigInteger.valueOf(DPN_ID), new IpAddress(OVS_IP.toCharArray()), VTEP_PORT));
178 interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class), intBuilder.build());
182 public void addInterfaceState_ExistingTZ() throws Exception {
183 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
184 .Interface> interfaces = new ArrayList<>();
185 interfaces.add(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
186 .interfaces.InterfaceBuilder().setName(PORT_NAME)
187 .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build())
189 interf = new InterfacesBuilder().setInterface(interfaces).build();
190 port = buildPort(PORT_IP);
191 network = buildNetwork(NetworkTypeVxlan.class);
192 TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID)
193 .setTunnelType(TunnelTypeVxlan.class).setSubnets(new ArrayList<>()).build();
195 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
196 .thenReturn(Futures.immediateCheckedFuture(Optional.of(interf)))
197 .thenReturn(Futures.immediateCheckedFuture(Optional.of(port)))
198 .thenReturn(Futures.immediateCheckedFuture(Optional.of(network)))
199 .thenReturn(Futures.immediateCheckedFuture(Optional.of(tz)))
200 .thenReturn(Futures.immediateCheckedFuture(Optional.of(getBridgeRefForNode())))
201 .thenReturn(Futures.immediateCheckedFuture(Optional.of(node)))
202 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
203 InterfaceBuilder intBuilder = new InterfaceBuilder();
204 intBuilder.setName(PHYS_PORT_NAME);
205 intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:" + DPN_ID})));
206 //NetworkId(new Uuid("12345678-1234-1234-1234-123456789012"));
207 expectedVteps.add(buildVtep(BigInteger.valueOf(DPN_ID), new IpAddress(OVS_IP.toCharArray()), VTEP_PORT));
208 interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class),
213 public void addInterfaceState_MultipleVtepsInTZ() throws Exception {
214 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
215 .Interface> interfaces = new ArrayList<>();
216 interfaces.add(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
217 .interfaces.InterfaceBuilder().setName(PORT_NAME)
218 .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build())
220 interf = new InterfacesBuilder().setInterface(interfaces).build();
221 port = buildPort(PORT_IP);
222 network = buildNetwork(NetworkTypeVxlan.class);
223 TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID)
224 .setTunnelType(TunnelTypeVxlan.class).setSubnets(new ArrayList<>()).build();
226 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
227 .thenReturn(Futures.immediateCheckedFuture(Optional.of(interf)))
228 .thenReturn(Futures.immediateCheckedFuture(Optional.of(port)))
229 .thenReturn(Futures.immediateCheckedFuture(Optional.of(network)))
230 .thenReturn(Futures.immediateCheckedFuture(Optional.of(tz)))
231 .thenReturn(Futures.immediateCheckedFuture(Optional.of(getBridgeRefForNode())))
232 .thenReturn(Futures.immediateCheckedFuture(Optional.of(node)))
233 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
234 InterfaceBuilder intBuilder = new InterfaceBuilder();
235 intBuilder.setName(PHYS_PORT_NAME);
236 intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:" + DPN_ID})));
237 //NetworkId(new Uuid("12345678-1234-1234-1234-123456789012"));
238 expectedVteps.add(buildVtep(BigInteger.valueOf(DPN_ID), new IpAddress(OVS_IP.toCharArray()), VTEP_PORT));
239 interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class),
244 public void addInterfaceState_VLAN_Network() throws Exception {
245 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
246 .Interface> interfaces = new ArrayList<>();
247 interfaces.add(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
248 .interfaces.InterfaceBuilder().setName(PORT_NAME)
249 .addAugmentation(ParentRefs.class, new ParentRefsBuilder().setParentInterface(PHYS_PORT_NAME).build())
251 interf = new InterfacesBuilder().setInterface(interfaces).build();
252 port = buildPort(PORT_IP);
253 network = buildNetwork(NetworkTypeVlan.class);
254 TransportZone tz = new TransportZoneBuilder().setZoneName(NETWORK_ID)
255 .setTunnelType(TunnelTypeVxlan.class).setSubnets(buildSubnets()).build();
257 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
258 .thenReturn(Futures.immediateCheckedFuture(Optional.of(interf)))
259 .thenReturn(Futures.immediateCheckedFuture(Optional.of(port)))
260 .thenReturn(Futures.immediateCheckedFuture(Optional.of(network)));
261 InterfaceBuilder intBuilder = new InterfaceBuilder();
262 intBuilder.setName(PHYS_PORT_NAME);
263 intBuilder.setLowerLayerIf(new ArrayList<>(Arrays.asList(new String[] {"int:" + DPN_ID})));
264 //NetworkId(new Uuid("12345678-1234-1234-1234-123456789012"));
265 interfaceStateToTransportZoneChangeListener.add(InstanceIdentifier.create(Interface.class), intBuilder.build());
269 public void addRouter() throws Exception {
270 when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
271 .thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
272 RouterDpnListBuilder intBuilder = new RouterDpnListBuilder();
273 RouterDpnList routerDpnList = buildRouterDpnList();
274 expectedVteps.add(buildVtep(BigInteger.valueOf(DPN_ID), new IpAddress(OVS_IP.toCharArray()), VTEP_PORT));
275 expectedVteps.add(buildVtep(DPN_ID_2, OVS_IP_2, VTEP_PORT));
276 neutronRouterDpnsToTransportZoneListener.add(InstanceIdentifier.create(RouterDpnList.class), routerDpnList);
279 private RouterDpnList buildRouterDpnList() {
280 RouterDpnListBuilder routerDpnBuilder = new RouterDpnListBuilder();
281 routerDpnBuilder.setRouterId(ROUTER_ID);
282 List<DpnVpninterfacesList> list = new ArrayList<>();
283 list.add(new DpnVpninterfacesListBuilder().setDpnId(BigInteger.valueOf(DPN_ID)).build());
284 list.add(new DpnVpninterfacesListBuilder().setDpnId(DPN_ID_2).build());
285 routerDpnBuilder.setDpnVpninterfacesList(list);
286 return routerDpnBuilder.build();
289 private Network buildNetwork(Class<? extends NetworkTypeBase> networkType) {
290 NetworkBuilder builder = new NetworkBuilder();
291 NetworkProviderExtensionBuilder augBuilder = new NetworkProviderExtensionBuilder();
292 augBuilder.setNetworkType(networkType);
293 builder.addAugmentation(NetworkProviderExtension.class, augBuilder.build());
294 return builder.build();
297 private List<Subnets> buildSubnets() {
298 SubnetsBuilder subnetsBuilder = new SubnetsBuilder();
299 List<Vteps> vteps = new ArrayList<>();
301 vteps.add(buildVtep(DPN_ID_2, OVS_IP_2, VTEP_PORT));
302 subnetsBuilder.setVteps(vteps);
303 subnetsBuilder.setPrefix(new IpPrefix(SUBNET.toCharArray()));
304 List<Subnets> subnets = new ArrayList<>();
305 subnets.add(subnetsBuilder.build());
309 private Vteps buildVtep(BigInteger dpnId, IpAddress portIp, String portName) {
310 VtepsBuilder vtepBuilder = new VtepsBuilder();
311 vtepBuilder.setDpnId(dpnId);
312 vtepBuilder.setIpAddress(portIp);
313 vtepBuilder.setPortname(portName);
314 return vtepBuilder.build();
318 private BridgeRefEntry getBridgeRefForNode() {
319 BridgeRefEntryBuilder breb = new BridgeRefEntryBuilder();
320 InstanceIdentifier<OvsdbBridgeAugmentation> path =
321 InstanceIdentifier.create(Node.class).augmentation(OvsdbBridgeAugmentation.class);
322 breb.setBridgeReference(new OvsdbBridgeRef(path));
326 private void buildNode() {
327 List<OpenvswitchOtherConfigs> list = new ArrayList<>();
328 list.add(new OpenvswitchOtherConfigsBuilder().setOtherConfigKey("local_ip")
329 .setOtherConfigValue(OVS_IP).build());
330 OvsdbNodeAugmentation ovsdbNode = new OvsdbNodeAugmentationBuilder().setOpenvswitchOtherConfigs(list).build();
331 when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(ovsdbNode);
334 private Port buildPort(String portIp) {
335 PortBuilder portBuilder = new PortBuilder();
336 portBuilder.setFixedIps(new ArrayList<>(Arrays.asList(new FixedIps[]
337 {new FixedIpsBuilder().setIpAddress(new IpAddress(portIp.toCharArray())).build()})));
338 portBuilder.setNetworkId(new Uuid(NETWORK_ID));
339 return portBuilder.build();
342 protected void testTZ(InvocationOnMock invocation) {
343 TransportZones tzs = (TransportZones) invocation.getArguments()[2];
345 List<TransportZone> tzList = tzs.getTransportZone();
346 assertNotNull(tzList);
347 assertEquals(1, tzList.size());
348 TransportZone tz = tzList.get(0);
352 private void assertTZ(TransportZone tz) {
353 assertSubnets(tz.getSubnets());
354 assertTunnelType(tz.getTunnelType());
355 assertZoneName(tz.getZoneName());
359 private void assertZoneName(String zoneName) {
360 assertEquals(NETWORK_ID, zoneName);
364 private void assertTunnelType(Class<? extends TunnelTypeBase> tunnelType) {
365 assertEquals(TunnelTypeVxlan.class, tunnelType);
369 private void assertSubnets(List<Subnets> subnets) {
370 assertNotNull(subnets);
371 assertEquals(1, subnets.size());
372 assertSubnet(subnets.get(0));
376 private void assertSubnet(Subnets subnets) {
377 assertEquals(new IpPrefix(SUBNET.toCharArray()), subnets.getPrefix());
378 assertNotNull(subnets.getVteps());
379 assertVtep(expectedVteps, subnets.getVteps());
382 private void assertVtep(List<Vteps> expectedVteps, List<Vteps> vteps) {
383 assertNotNull(vteps);
384 assertEquals(expectedVteps.size(), vteps.size());
386 for (Vteps expectedVtep : expectedVteps) {
387 for (Vteps vtep : vteps) {
389 flag &= expectedVtep.getDpnId().equals(vtep.getDpnId());
390 flag &= expectedVtep.getIpAddress().equals(vtep.getIpAddress());
391 flag &= expectedVtep.getPortname().equals(vtep.getPortname());