Remove unnecessary generic types
[netvirt.git] / vpnservice / neutronvpn / neutronvpn-impl / src / test / java / org / opendaylight / netvirt / neutronvpn / ToTransportZoneTest.java
1 /*
2  * Copyright (c) 2015 - 2016 HPE 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 package org.opendaylight.netvirt.neutronvpn;
9
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;
17
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;
84
85 @RunWith(MockitoJUnitRunner.class)
86 public class ToTransportZoneTest {
87
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";
99
100     @Mock
101     private DataBroker dataBroker;
102     @Mock
103     private NeutronvpnManager neutronvpnManager;
104     @Mock
105     private ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
106     @Mock
107     private WriteTransaction mockWriteTx;
108     @Mock
109     private ReadOnlyTransaction mockReadTx;
110     @Mock
111     private Node node;
112     private Interfaces interf;
113     private Port port;
114     private List<Vteps> expectedVteps = new ArrayList<>();
115     InterfaceStateToTransportZoneListener interfaceStateToTransportZoneChangeListener;
116     NeutronRouterDpnsToTransportZoneListener neutronRouterDpnsToTransportZoneListener;
117     private Network network;
118
119     @Before
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>() {
128             @Override
129             public Void answer(InvocationOnMock invocation) throws Throwable {
130                 testTZ(invocation);
131                 return null;
132             }
133         }).when(mockWriteTx).put(any(), any(), any(), any(Boolean.class));
134         doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit();
135         doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
136
137         Subnetmap subnetMap = new SubnetmapBuilder().setSubnetIp(SUBNET).build();
138
139         when(neutronvpnManager.updateSubnetmapNodeWithPorts(any(Uuid.class), any(Uuid.class), any(Uuid.class)))
140             .thenReturn(subnetMap);
141
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);
148     }
149
150     @After
151     public void afterTestCleanup() {
152         expectedVteps.clear();
153     }
154
155     @Test
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())
162             .build());
163         interf = new InterfacesBuilder().setInterface(interfaces).build();
164         port = buildPort(PORT_IP);
165         buildNode();
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());
179     }
180
181     @Test
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())
188             .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();
194         buildNode();
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),
209             intBuilder.build());
210     }
211
212     @Test
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())
219             .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();
225         buildNode();
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),
240             intBuilder.build());
241     }
242
243     @Test
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())
250             .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();
256         buildNode();
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());
266     }
267
268     @Test
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);
277     }
278
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();
287     }
288
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();
295     }
296
297     private List<Subnets> buildSubnets() {
298         SubnetsBuilder subnetsBuilder = new SubnetsBuilder();
299         List<Vteps> vteps = new ArrayList<>();
300
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());
306         return subnets;
307     }
308
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();
315     }
316
317
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));
323         return breb.build();
324     }
325
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);
332     }
333
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();
340     }
341
342     protected void testTZ(InvocationOnMock invocation) {
343         TransportZones tzs = (TransportZones) invocation.getArguments()[2];
344         assertNotNull(tzs);
345         List<TransportZone> tzList = tzs.getTransportZone();
346         assertNotNull(tzList);
347         assertEquals(1, tzList.size());
348         TransportZone tz = tzList.get(0);
349         assertTZ(tz);
350     }
351
352     private void assertTZ(TransportZone tz) {
353         assertSubnets(tz.getSubnets());
354         assertTunnelType(tz.getTunnelType());
355         assertZoneName(tz.getZoneName());
356     }
357
358
359     private void assertZoneName(String zoneName) {
360         assertEquals(NETWORK_ID, zoneName);
361     }
362
363
364     private void assertTunnelType(Class<? extends TunnelTypeBase> tunnelType) {
365         assertEquals(TunnelTypeVxlan.class, tunnelType);
366     }
367
368
369     private void assertSubnets(List<Subnets> subnets) {
370         assertNotNull(subnets);
371         assertEquals(1, subnets.size());
372         assertSubnet(subnets.get(0));
373     }
374
375
376     private void assertSubnet(Subnets subnets) {
377         assertEquals(new IpPrefix(SUBNET.toCharArray()), subnets.getPrefix());
378         assertNotNull(subnets.getVteps());
379         assertVtep(expectedVteps, subnets.getVteps());
380     }
381
382     private void assertVtep(List<Vteps> expectedVteps, List<Vteps> vteps) {
383         assertNotNull(vteps);
384         assertEquals(expectedVteps.size(), vteps.size());
385         outer_loop:
386         for (Vteps expectedVtep : expectedVteps) {
387             for (Vteps vtep : vteps) {
388                 boolean flag = true;
389                 flag &= expectedVtep.getDpnId().equals(vtep.getDpnId());
390                 flag &= expectedVtep.getIpAddress().equals(vtep.getIpAddress());
391                 flag &= expectedVtep.getPortname().equals(vtep.getPortname());
392                 if (flag) {
393                     continue outer_loop;
394                 }
395             }
396             fail();
397         }
398     }
399 }