blob: b9f259b3b8a0169e22e109f67b48f2dbc4f7c6bb [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Brian Stanke0e5c94e2016-03-08 11:20:04 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24import org.onlab.junit.TestUtils;
25import org.onosproject.common.event.impl.TestEventDispatcher;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.IdGenerator;
29import org.onosproject.event.Event;
Brian Stanke11f6d532016-07-05 16:17:59 -040030import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050031import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
32import org.onosproject.incubator.net.virtual.NetworkId;
33import org.onosproject.incubator.net.virtual.TenantId;
34import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040035import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050036import org.onosproject.incubator.net.virtual.VirtualLink;
37import org.onosproject.incubator.net.virtual.VirtualNetwork;
38import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
Brian Stanke11f6d532016-07-05 16:17:59 -040039import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
yoonseon6b972c32016-12-06 16:45:03 -080041import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050042import org.onosproject.incubator.net.virtual.VirtualPort;
yoonseon214963b2016-11-21 15:41:07 -080043import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050044import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
45import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050046import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040047import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050049import org.onosproject.net.PortNumber;
Brian Stanke7a81b532016-06-14 15:43:51 -040050import org.onosproject.net.TestDeviceParams;
Brian Stanke11f6d532016-07-05 16:17:59 -040051import org.onosproject.net.intent.FakeIntentManager;
52import org.onosproject.net.intent.Intent;
53import org.onosproject.net.intent.IntentState;
54import org.onosproject.net.intent.Key;
55import org.onosproject.net.intent.MockIdGenerator;
56import org.onosproject.net.intent.TestableIntentService;
Brian Stankefb61df42016-07-25 11:47:51 -040057import org.onosproject.net.topology.Topology;
58import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050059import org.onosproject.store.service.TestStorageService;
60
Brian Stankefb61df42016-07-25 11:47:51 -040061import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050062import java.util.Collection;
63import java.util.List;
64import java.util.Set;
65import java.util.concurrent.atomic.AtomicLong;
66
67import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040068import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050069
70/**
71 * Junit tests for VirtualNetworkManager.
72 */
Brian Stanke7a81b532016-06-14 15:43:51 -040073public class VirtualNetworkManagerTest extends TestDeviceParams {
Brian Stanke86914282016-05-25 15:36:50 -040074 private final String tenantIdValue1 = "TENANT_ID1";
75 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050076
77 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -080078 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050079 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
80 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040081 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040082 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040083 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040084 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050085
Brian Stankefb61df42016-07-25 11:47:51 -040086 private ConnectPoint cp6;
87 private ConnectPoint cp7;
88
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089 @Before
90 public void setUp() throws Exception {
91 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Brian Stanke11f6d532016-07-05 16:17:59 -040092 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050093
94 coreService = new TestCoreService();
95 virtualNetworkManagerStore.setCoreService(coreService);
96 TestUtils.setField(coreService, "coreService", new TestCoreService());
yoonseon214963b2016-11-21 15:41:07 -080097 TestUtils.setField(virtualNetworkManagerStore, "storageService",
98 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -050099 virtualNetworkManagerStore.activate();
100
101 manager = new VirtualNetworkManager();
102 manager.store = virtualNetworkManagerStore;
103 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400104 manager.intentService = intentService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
106 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500107 }
108
109 @After
110 public void tearDown() {
111 virtualNetworkManagerStore.deactivate();
112 manager.removeListener(listener);
113 manager.deactivate();
114 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400115 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500116 }
117
118 /**
119 * Tests registering a null tenant id.
120 */
121 @Test(expected = NullPointerException.class)
122 public void testRegisterNullTenantId() {
123 manager.registerTenantId(null);
124 }
125
126 /**
127 * Tests registering/unregistering a tenant id.
128 */
129 @Test
130 public void testRegisterUnregisterTenantId() {
131 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
132 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
133 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
134 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
135 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
136
137 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
138 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
139 tenantIdCollection = manager.getTenantIds();
140 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
141
142 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800143 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
144 VirtualNetworkEvent.Type.TENANT_REGISTERED,
145 VirtualNetworkEvent.Type.TENANT_REGISTERED,
146 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500147 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
148 }
149
150 /**
151 * Tests adding a null virtual network.
152 */
153 @Test(expected = NullPointerException.class)
154 public void testCreateNullVirtualNetwork() {
155 manager.createVirtualNetwork(null);
156 }
157
158 /**
159 * Tests add and remove of virtual networks.
160 */
161 @Test
162 public void testAddRemoveVirtualNetwork() {
163 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
164 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
165 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
166 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
167 assertNotNull("The virtual network set should not be null", virtualNetworks);
168 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
169
Brian Stanke5df14472016-03-11 19:34:38 -0500170 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500171 for (VirtualNetwork virtualNetwork : virtualNetworks) {
172 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500173 assertEquals("The expected virtual network size does not match",
174 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500175 // attempt to remove the same virtual network again.
176 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500177 assertEquals("The expected virtual network size does not match",
178 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500179 }
180 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
181 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
182
Brian Stanke5df14472016-03-11 19:34:38 -0500183 // Create/remove a virtual network.
184 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
185 manager.removeVirtualNetwork(virtualNetwork.id());
186
187 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
188 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
189
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500190 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800191 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
192 VirtualNetworkEvent.Type.NETWORK_ADDED,
193 VirtualNetworkEvent.Type.NETWORK_ADDED,
194 VirtualNetworkEvent.Type.NETWORK_REMOVED,
195 VirtualNetworkEvent.Type.NETWORK_REMOVED,
196 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500197 VirtualNetworkEvent.Type.NETWORK_REMOVED);
198 }
199
200 /**
201 * Tests adding a null virtual device.
202 */
203 @Test(expected = NullPointerException.class)
204 public void testCreateNullVirtualDevice() {
205 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
206 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
207
208 manager.createVirtualDevice(virtualNetwork.id(), null);
209 }
210
211 /**
212 * Tests adding a virtual device where no virtual network exists.
213 */
214 @Test(expected = IllegalStateException.class)
215 public void testCreateVirtualDeviceWithNoNetwork() {
216 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800217 VirtualNetwork virtualNetwork =
218 new DefaultVirtualNetwork(NetworkId.NONE,
219 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500220
Brian Stanke7a81b532016-06-14 15:43:51 -0400221 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500222 }
223
224 /**
225 * Tests add and remove of virtual devices.
226 */
227 @Test
228 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500229 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
230
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500231 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500232 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800233 VirtualNetwork virtualNetwork1 =
234 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500235 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800236 VirtualNetwork virtualNetwork2 =
237 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500238 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400239 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500240 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400241 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500242 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500243
244 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
245 assertNotNull("The virtual device set should not be null", virtualDevices1);
246 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
247
248 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
249 assertNotNull("The virtual device set should not be null", virtualDevices2);
250 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
251
252 for (VirtualDevice virtualDevice : virtualDevices1) {
253 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500254 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
255 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500256 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
257 }
258 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
259 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
260
Brian Stanke5df14472016-03-11 19:34:38 -0500261 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400262 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500263 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500264 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500265 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500266 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
267 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
268
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500269 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 validateEvents((Enum[]) expectedEventTypes.toArray(
271 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500272 }
273
274 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400275 * Tests adding a null virtual host.
276 */
277 @Test(expected = NullPointerException.class)
278 public void testCreateNullVirtualHost() {
279 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800280 VirtualNetwork virtualNetwork =
281 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400282
283 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
284 }
285
286 /**
287 * Tests adding a virtual host where no virtual network exists.
288 */
289 @Test(expected = IllegalStateException.class)
290 public void testCreateVirtualHostWithNoNetwork() {
291 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800292 VirtualNetwork virtualNetwork =
293 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400294
295 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
296 }
297
298 /**
299 * Tests add and remove of virtual hosts.
300 */
301 @Test
302 public void testAddRemoveVirtualHost() {
303 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800304 VirtualNetwork virtualNetwork1 =
305 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
306 VirtualNetwork virtualNetwork2 =
307 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400308 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
309 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
310
311 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
312 assertNotNull("The virtual host set should not be null", virtualHosts1);
313 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
314
315 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
316 assertNotNull("The virtual host set should not be null", virtualHosts2);
317 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
318
319 for (VirtualHost virtualHost : virtualHosts1) {
320 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
321 // attempt to remove the same virtual host again.
322 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
323 }
324 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
325 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
326
327 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800328 VirtualHost virtualHost =
329 manager.createVirtualHost(virtualNetwork1.id(),
330 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400331 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
332 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
333 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
334 }
335
336 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500337 * Tests add and remove of virtual links.
338 */
339 @Test
340 public void testAddRemoveVirtualLink() {
341 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800342 VirtualNetwork virtualNetwork1 =
343 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500344 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400345 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500346 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400347 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500348 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400349 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700350 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400351
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500352 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400353 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700354 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400355
Brian Stanke9a108972016-04-11 15:25:17 -0400356 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
357 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500358
359 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
360 assertNotNull("The virtual link set should not be null", virtualLinks);
361 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
362
363 for (VirtualLink virtualLink : virtualLinks) {
364 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
365 // attempt to remove the same virtual link again.
366 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
367 }
368 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
369 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500370
371 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400372 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500373 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
374 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
375 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500376 }
377
378 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400379 * Tests adding the same virtual link twice.
380 */
381 @Test(expected = IllegalStateException.class)
382 public void testAddSameVirtualLink() {
383 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800384 VirtualNetwork virtualNetwork1 =
385 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400386 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400387 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400388 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400389 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400390 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400391 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700392 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400393
Brian Stanke9a108972016-04-11 15:25:17 -0400394 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400395 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700396 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400397
Brian Stanke9a108972016-04-11 15:25:17 -0400398 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
399 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
400 }
401
402 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500403 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500404 */
405 @Test
406 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500407 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
408
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500409 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500410 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800411 VirtualNetwork virtualNetwork1 =
412 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500413 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500414 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400415 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500416 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700417 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500418
yoonseon214963b2016-11-21 15:41:07 -0800419 manager.createVirtualPort(virtualNetwork1.id(),
420 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500421 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800422 manager.createVirtualPort(virtualNetwork1.id(),
423 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500424 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500425
Brian Stanke5df14472016-03-11 19:34:38 -0500426 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500427 assertNotNull("The virtual port set should not be null", virtualPorts);
428 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
429
430 for (VirtualPort virtualPort : virtualPorts) {
431 manager.removeVirtualPort(virtualNetwork1.id(),
432 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500433 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500434 // attempt to remove the same virtual port again.
435 manager.removeVirtualPort(virtualNetwork1.id(),
436 (DeviceId) virtualPort.element().id(), virtualPort.number());
437 }
Brian Stanke5df14472016-03-11 19:34:38 -0500438 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
439 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
440
441 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800442 VirtualPort virtualPort =
443 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700444 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500445 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
446
447 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
448 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
449 PortNumber.portNumber(1), newCp);
450 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
451
yoonseon214963b2016-11-21 15:41:07 -0800452 manager.removeVirtualPort(virtualNetwork1.id(),
453 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500454 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500455 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500456 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500457
458 // Validate that the events were all received in the correct order.
459 validateEvents((Enum[]) expectedEventTypes.toArray(
460 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500461 }
462
463 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400464 * Tests the addOrUpdateIntent() method in the store with a null intent.
465 */
466 @Test(expected = NullPointerException.class)
467 public void testAddOrUpdateNullIntent() {
468 manager.store.addOrUpdateIntent(null, null);
469 }
470
471 /**
472 * Tests the removeIntent() method in the store with a null intent key.
473 */
474 @Test(expected = NullPointerException.class)
475 public void testRemoveNullIntentKey() {
476 manager.store.removeIntent(null);
477 }
478
479 /**
480 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
481 */
482 @Test
483 public void testAddOrUpdateIntent() {
484 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800485 VirtualNetwork virtualNetwork =
486 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400487 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
488 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
489
490 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
491 .networkId(virtualNetwork.id())
492 .key(Key.of("Test", APP_ID))
493 .appId(APP_ID)
494 .ingressPoint(cp1)
495 .egressPoint(cp2)
496 .build();
497
498 // Add the intent to the store.
499 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800500 assertEquals("The intent size should match.", 1,
501 manager.store.getIntents().size());
502 assertNotNull("The intent should not be null.",
503 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400504
505 // remove the intent from the store.
506 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800507 assertTrue("The intents should be empty.",
508 manager.store.getIntents().isEmpty());
509 assertNull("The intent should be null.",
510 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400511 }
512
513 /**
514 * Tests the addTunnelId() method in the store with a null intent.
515 */
516 @Test(expected = NullPointerException.class)
517 public void testAddTunnelIdNullIntent() {
518 manager.store.addTunnelId(null, null);
519 }
520
521 /**
522 * Tests the removeTunnelId() method in the store with a null intent.
523 */
524 @Test(expected = NullPointerException.class)
525 public void testRemoveTunnelIdNullIntent() {
526 manager.store.removeTunnelId(null, null);
527 }
528
529 /**
530 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
531 */
532 @Test
533 public void testAddTunnelId() {
534 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
535 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
536 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
537 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
538
539 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
540 .networkId(virtualNetwork.id())
541 .key(Key.of("Test", APP_ID))
542 .appId(APP_ID)
543 .ingressPoint(cp1)
544 .egressPoint(cp2)
545 .build();
546
547 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
548 // Add the intent to tunnelID mapping to the store.
549 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800550 assertEquals("The tunnels size should match.", 1,
551 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400552
553 // Remove the intent to tunnelID mapping from the store.
554 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800555 assertTrue("The tunnels should be empty.",
556 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400557 }
558
Brian Stankefb61df42016-07-25 11:47:51 -0400559
560 /**
561 * Method to create the virtual network for further testing.
562 **/
563 private VirtualNetwork setupVirtualNetworkTopology() {
564 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800565 VirtualNetwork virtualNetwork =
566 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400567
568 VirtualDevice virtualDevice1 =
569 manager.createVirtualDevice(virtualNetwork.id(), DID1);
570 VirtualDevice virtualDevice2 =
571 manager.createVirtualDevice(virtualNetwork.id(), DID2);
572 VirtualDevice virtualDevice3 =
573 manager.createVirtualDevice(virtualNetwork.id(), DID3);
574 VirtualDevice virtualDevice4 =
575 manager.createVirtualDevice(virtualNetwork.id(), DID4);
576 VirtualDevice virtualDevice5 =
577 manager.createVirtualDevice(virtualNetwork.id(), DID5);
578
579 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
580 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700581 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400582
583 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
584 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700585 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400586
587 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
588 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700589 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400590
591 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
592 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700593 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400594
595 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
596 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700597 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400598
599 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
600 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700601 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400602
603 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
604 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700605 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400606
607 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
608 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700609 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400610
611 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
612 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700613 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400614
615 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
616 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
617 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
618 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
619 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
620 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
621 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
622 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
623 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
624 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
625 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
626 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
627
628 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800629 topologyProvider = new DefaultVirtualNetworkProvider();
630 try {
631 TestUtils.setField(topologyProvider, "topologyService", topologyService);
632 } catch (TestUtils.TestUtilsException e) {
633 e.printStackTrace();
634 }
635// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400636
637 return virtualNetwork;
638 }
639
640 /**
641 * Test the topologyChanged() method.
642 */
643 @Test
644 public void testTopologyChanged() {
645 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800646 VirtualNetworkProviderService providerService =
647 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400648
649 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800650 assertEquals("The cluster count did not match.", 2,
651 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400652
653 // Adding this link will join the two clusters together.
654 List<Event> reasons = new ArrayList<>();
655 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
656 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
657 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
658 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
659
660 Topology topology = topologyService.currentTopology();
661 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
662
663 // Validate that all links are still active.
664 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800665 assertTrue("The virtual link should be active.",
666 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400667 });
668
669 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
670 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
671 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
672
673 // Validate that all links are active again.
674 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800675 assertTrue("The virtual link should be active.",
676 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400677 });
678 }
679
Brian Stanke11f6d532016-07-05 16:17:59 -0400680 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500681 * Method to validate that the actual versus expected virtual network events were
682 * received correctly.
683 *
684 * @param types expected virtual network events.
685 */
686 private void validateEvents(Enum... types) {
687 TestTools.assertAfter(100, () -> {
688 int i = 0;
689 assertEquals("wrong events received", types.length, listener.events.size());
690 for (Event event : listener.events) {
691 assertEquals("incorrect event type", types[i], event.type());
692 i++;
693 }
694 listener.events.clear();
695 });
696 }
697
698 /**
699 * Test listener class to receive virtual network events.
700 */
701 private static class TestListener implements VirtualNetworkListener {
702
Brian Stanke7a81b532016-06-14 15:43:51 -0400703 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500704
705 @Override
706 public void event(VirtualNetworkEvent event) {
707 events.add(event);
708 }
709
710 }
711
Brian Stanke5df14472016-03-11 19:34:38 -0500712 /**
713 * Core service test class.
714 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500715 private class TestCoreService extends CoreServiceAdapter {
716
717 @Override
718 public IdGenerator getIdGenerator(String topic) {
719 return new IdGenerator() {
720 private AtomicLong counter = new AtomicLong(0);
721
722 @Override
723 public long getNewId() {
724 return counter.getAndIncrement();
725 }
726 };
727 }
728 }
729}