2 * Copyright (c) 2015 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.ofoverlay.endpoint;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
16 import static org.mockito.Matchers.any;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.never;
19 import static org.mockito.Mockito.spy;
20 import static org.mockito.Mockito.times;
21 import static org.mockito.Mockito.verify;
22 import static org.mockito.Mockito.when;
24 import com.google.common.base.Optional;
25 import com.google.common.util.concurrent.CheckedFuture;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.List;
31 import java.util.concurrent.ScheduledExecutorService;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
35 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
36 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
37 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
38 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
39 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
41 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
42 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
43 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
44 import org.opendaylight.groupbasedpolicy.dto.EgKey;
45 import org.opendaylight.groupbasedpolicy.dto.EpKey;
46 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.EndpointListener;
47 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3Context;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
70 import org.opendaylight.yangtools.concepts.ListenerRegistration;
71 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
73 public class EndpointManagerTest {
75 private EndpointManager manager;
76 private DataBroker dataProvider;
77 private PacketProcessingService packetService;
78 private SalFlowService flowService;
79 private NotificationService notificationService;
80 private ScheduledExecutorService executor;
81 private SwitchManager switchManager;
82 private EndpointListener endpointListener;
83 private Endpoint endpoint1;
84 private Endpoint endpoint2;
85 private TenantId tenantId;
86 private EndpointGroupId endpointGroupId;
87 private L2BridgeDomainId l2BridgeDomainId;
88 private OfOverlayContext context1;
89 private OfOverlayContext context2;
90 private NodeId nodeId1;
91 private NodeId nodeId2;
92 private EndpointL3 oldL3Ep;
93 private EndpointL3 newL3Ep;
94 private Optional<Endpoints> optionalRead;
96 // TODO get rid of unnecessary mocks (endpoint1, endpoint2, their parameters)
98 @SuppressWarnings("unchecked")
100 public void initialisation() throws Exception {
101 dataProvider = mock(DataBroker.class);
102 packetService = mock(PacketProcessingService.class);
103 flowService = mock(SalFlowService.class);
104 notificationService = mock(NotificationService.class);
105 executor = mock(ScheduledExecutorService.class);
106 switchManager = mock(SwitchManager.class);
107 WriteTransaction writeTransaction = mock(WriteTransaction.class);
108 when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
109 CheckedFuture<Void, TransactionCommitFailedException> checkedFutureWrite = mock(CheckedFuture.class);
110 when(writeTransaction.submit()).thenReturn(checkedFutureWrite);
111 BindingAwareBroker.RpcRegistration<EndpointService> rpcRegistration =
112 mock(BindingAwareBroker.RpcRegistration.class);
113 when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
114 any(ClusteredDataTreeChangeListener.class))).thenReturn(mock(ListenerRegistration.class));
116 manager = spy(new EndpointManager(dataProvider, packetService, flowService, notificationService, executor, switchManager));
117 endpointListener = mock(EndpointListener.class);
118 manager.registerListener(endpointListener);
120 endpoint1 = mock(Endpoint.class);
121 endpoint2 = mock(Endpoint.class);
122 tenantId = mock(TenantId.class);
123 endpointGroupId = mock(EndpointGroupId.class);
124 l2BridgeDomainId = mock(L2BridgeDomainId.class);
125 MacAddress macAddress = new MacAddress("12:34:56:78:9a:bc");
126 when(endpoint1.getTenant()).thenReturn(tenantId);
127 when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
128 when(endpoint1.getL2Context()).thenReturn(l2BridgeDomainId);
129 when(endpoint1.getMacAddress()).thenReturn(macAddress);
130 when(endpoint2.getTenant()).thenReturn(tenantId);
131 when(endpoint2.getEndpointGroup()).thenReturn(endpointGroupId);
132 when(endpoint2.getL2Context()).thenReturn(l2BridgeDomainId);
133 when(endpoint2.getMacAddress()).thenReturn(macAddress);
134 context1 = mock(OfOverlayContext.class);
135 context2 = mock(OfOverlayContext.class);
136 when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(context1);
137 when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(context2);
138 nodeId1 = mock(NodeId.class);
139 nodeId2 = mock(NodeId.class);
140 when(context1.getNodeId()).thenReturn(nodeId1);
141 when(context2.getNodeId()).thenReturn(nodeId2);
142 when(nodeId1.getValue()).thenReturn("nodeValue1");
143 when(nodeId2.getValue()).thenReturn("nodeValue2");
146 oldL3Ep = mock(EndpointL3.class);
147 newL3Ep = mock(EndpointL3.class);
149 // getEndpointsFromDataStore
150 ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
151 when(dataProvider.newReadOnlyTransaction()).thenReturn(readTransaction);
152 CheckedFuture<Optional<Endpoints>, ReadFailedException> checkedFutureRead = mock(CheckedFuture.class);
153 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
154 .thenReturn(checkedFutureRead);
155 optionalRead = mock(Optional.class);
156 when(checkedFutureRead.checkedGet()).thenReturn(optionalRead);
157 when(optionalRead.isPresent()).thenReturn(false);
166 public void getGroupsForNodeTest() {
167 assertTrue(manager.getGroupsForNode(nodeId1).isEmpty());
168 manager.processEndpoint(null, endpoint1);
169 assertFalse(manager.getGroupsForNode(nodeId1).isEmpty());
173 public void getNodesForGroupTest() {
174 EgKey egKey = mock(EgKey.class);
175 Set<NodeId> nodesForGroup = manager.getNodesForGroup(egKey);
176 assertNotNull(nodesForGroup);
177 assertTrue(nodesForGroup.isEmpty());
181 public void getEndpointsForNodeTestNodeIdEgKey() {
182 EgKey egKey = new EgKey(tenantId, endpointGroupId);
183 assertTrue(manager.getEndpointsForNode(nodeId1, egKey).isEmpty());
184 manager.processEndpoint(null, endpoint1);
185 assertFalse(manager.getEndpointsForNode(nodeId1, egKey).isEmpty());
189 public void getEndpointsForNodeTestNodeId() {
190 assertTrue(manager.getEndpointsForNode(nodeId1).isEmpty());
191 manager.processEndpoint(null, endpoint1);
192 assertFalse(manager.getEndpointsForNode(nodeId1).isEmpty());
196 public void getEndpoint() {
197 EpKey epKey = new EpKey(endpoint1.getL2Context(), endpoint1.getMacAddress());
198 manager.processEndpoint(null, endpoint1);
199 assertEquals(endpoint1, manager.getEndpoint(epKey));
202 @SuppressWarnings("unchecked")
204 public void getEndpointsL3PrefixForTenantTest() throws Exception {
205 ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class);
206 when(dataProvider.newReadOnlyTransaction()).thenReturn(readTransaction);
207 CheckedFuture<Optional<Endpoints>, ReadFailedException> resultFuture = mock(CheckedFuture.class);
208 when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
209 .thenReturn(resultFuture);
210 Optional<Endpoints> optional = mock(Optional.class);
211 when(resultFuture.checkedGet()).thenReturn(optional);
212 when(optional.isPresent()).thenReturn(true);
213 Endpoints endpoints = mock(Endpoints.class);
214 when(optional.get()).thenReturn(endpoints);
215 EndpointL3Prefix endpointL3Prefix = mock(EndpointL3Prefix.class);
216 when(endpoints.getEndpointL3Prefix()).thenReturn(Collections.singletonList(endpointL3Prefix));
217 when(endpointL3Prefix.getTenant()).thenReturn(tenantId);
219 Collection<EndpointL3Prefix> result = manager.getEndpointsL3PrefixForTenant(tenantId);
220 assertTrue(result.contains(endpointL3Prefix));
223 @SuppressWarnings("unchecked")
225 public void getEndpointsFromDataStoreTest() throws Exception {
226 ReadOnlyTransaction transaction = mock(ReadOnlyTransaction.class);
227 when(dataProvider.newReadOnlyTransaction()).thenReturn(transaction);
228 CheckedFuture<Optional<Endpoints>, ReadFailedException> checkedFuture = mock(CheckedFuture.class);
229 when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
230 .thenReturn(checkedFuture);
231 Optional<Endpoints> optional = mock(Optional.class);
232 when(checkedFuture.checkedGet()).thenReturn(optional);
233 when(optional.isPresent()).thenReturn(false);
234 assertNull(manager.getEndpointsFromDataStore());
236 when(optional.isPresent()).thenReturn(true);
237 Endpoints endpoints = mock(Endpoints.class);
238 when(optional.get()).thenReturn(endpoints);
239 assertEquals(endpoints, manager.getEndpointsFromDataStore());
241 manager = new EndpointManager(null, packetService, flowService, notificationService, executor, switchManager);
242 assertNull(manager.getEndpointsFromDataStore());
246 public void getL3EndpointsTestEndpointsNull() throws Exception {
247 assertNull(manager.getL3Endpoints());
251 public void getL3EndpointsTestEndpointL3Null() throws Exception {
252 when(optionalRead.isPresent()).thenReturn(true);
253 Endpoints endpoints = mock(Endpoints.class);
254 when(optionalRead.get()).thenReturn(endpoints);
255 when(endpoints.getEndpointL3()).thenReturn(null);
257 assertNull(manager.getL3Endpoints());
261 public void getL3EndpointsTest() throws Exception {
262 when(optionalRead.isPresent()).thenReturn(true);
263 Endpoints endpoints = mock(Endpoints.class);
264 when(optionalRead.get()).thenReturn(endpoints);
265 List<EndpointL3> endpointL3List = Collections.singletonList(mock(EndpointL3.class));
266 when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
268 assertEquals(endpointL3List, manager.getL3Endpoints());
272 public void getL3EpWithNatByL2KeyTest() {
273 when(optionalRead.isPresent()).thenReturn(true);
274 Endpoints endpoints = mock(Endpoints.class);
275 when(optionalRead.get()).thenReturn(endpoints);
276 EndpointL3 endpointL3 = mock(EndpointL3.class);
277 List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
278 when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
280 NatAddress overlayL3Nat = mock(NatAddress.class);
281 when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
282 when(overlayL3Nat.getNatAddress()).thenReturn(mock(IpAddress.class));
284 when(endpointL3.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
285 when(endpointL3.getMacAddress()).thenReturn(mock(MacAddress.class));
287 Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
288 assertTrue(result.containsValue(endpointL3));
292 public void getL3EpWithNatByL2KeyTestL3EpsNull() {
293 Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
294 assertTrue(result.isEmpty());
298 public void getL3EpWithNatByL2KeyTestGetMacAddressNull() {
299 when(optionalRead.isPresent()).thenReturn(true);
300 Endpoints endpoints = mock(Endpoints.class);
301 when(optionalRead.get()).thenReturn(endpoints);
302 EndpointL3 endpointL3 = mock(EndpointL3.class);
303 List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
304 when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
306 NatAddress overlayL3Nat = mock(NatAddress.class);
307 when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
309 when(endpointL3.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
310 when(endpointL3.getMacAddress()).thenReturn(null);
312 Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
313 assertTrue(result.isEmpty());
317 public void getL3EpWithNatByL2KeyTestGetL2ContextNull() {
318 when(optionalRead.isPresent()).thenReturn(true);
319 Endpoints endpoints = mock(Endpoints.class);
320 when(optionalRead.get()).thenReturn(endpoints);
321 EndpointL3 endpointL3 = mock(EndpointL3.class);
322 List<EndpointL3> endpointL3List = Collections.singletonList(endpointL3);
323 when(endpoints.getEndpointL3()).thenReturn(endpointL3List);
325 NatAddress overlayL3Nat = mock(NatAddress.class);
326 when(endpointL3.getAugmentation(NatAddress.class)).thenReturn(overlayL3Nat);
328 when(endpointL3.getL2Context()).thenReturn(null);
329 when(endpointL3.getMacAddress()).thenReturn(mock(MacAddress.class));
331 Map<EndpointKey, EndpointL3> result = manager.getL3EpWithNatByL2Key();
332 assertTrue(result.isEmpty());
336 public void getEndpointsForGroupTest() {
337 EgKey newEgKey = new EgKey(tenantId, endpointGroupId);
338 assertTrue(manager.getEndpointsForGroup(newEgKey).isEmpty());
339 manager.processEndpoint(null, endpoint1);
340 assertFalse(manager.getEndpointsForGroup(newEgKey).isEmpty());
344 public void getConditionsForEndpoint() {
345 Endpoint endpoint = mock(Endpoint.class);
346 when(endpoint.getCondition()).thenReturn(null);
347 assertTrue(manager.getConditionsForEndpoint(endpoint).isEmpty());
349 List<ConditionName> conditionNameList = Collections.singletonList(mock(ConditionName.class));
350 when(endpoint.getCondition()).thenReturn(conditionNameList);
351 assertEquals(conditionNameList, manager.getConditionsForEndpoint(endpoint));
355 public void updateEndpointL3TestNewL3EpValidExternalTrue() throws Exception {
356 when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
357 when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
358 when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
359 when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
361 OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
362 when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
364 NetworkDomainId networkDomainId = mock(NetworkDomainId.class);
365 when(newL3Ep.getNetworkContainment()).thenReturn(networkDomainId);
367 EndpointL3Key endpointL3Key = mock(EndpointL3Key.class);
368 when(newL3Ep.getKey()).thenReturn(endpointL3Key);
369 IpAddress ipAddress = mock(IpAddress.class);
370 when(endpointL3Key.getIpAddress()).thenReturn(ipAddress);
371 when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
372 manager.processL3Endpoint(null, newL3Ep);
373 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
377 public void updateEndpointL3TestNewL3EpValidExternalTrueNetworkContainmentNull() throws Exception {
378 when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
379 when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
380 when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
381 when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
383 OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
384 when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
386 when(newL3Ep.getNetworkContainment()).thenReturn(null);
388 EndpointL3Key endpointL3Key = mock(EndpointL3Key.class);
389 when(newL3Ep.getKey()).thenReturn(endpointL3Key);
390 IpAddress ipAddress = mock(IpAddress.class);
391 when(endpointL3Key.getIpAddress()).thenReturn(ipAddress);
392 when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
393 manager.processL3Endpoint(null, newL3Ep);
394 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
398 public void updateEndpointL3TestNewL3EpValidInternal() throws Exception {
399 when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
400 when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
401 when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
402 when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
404 OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
405 when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
407 when(newL3Ep.getNetworkContainment()).thenReturn(null);
409 when(newL3Ep.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
410 when(newL3Ep.getMacAddress()).thenReturn(mock(MacAddress.class));
411 when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
412 manager.processL3Endpoint(null, newL3Ep);
413 verify(endpointListener).endpointUpdated(any(EpKey.class));
417 public void updateEndpointL3TestNewL3EpValidFalse() throws Exception {
418 when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
419 when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
420 when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
421 when(newL3Ep.getIpAddress()).thenReturn(null);
422 when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
423 manager.processL3Endpoint(null, newL3Ep);
424 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
428 public void updateEndpointL3TestDelete() throws Exception {
429 when(oldL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
430 manager.processL3Endpoint(oldL3Ep, null);
431 verify(endpointListener).endpointUpdated(any(EpKey.class));
435 public void updateEndpointL3TestUpdate() throws Exception {
436 when(oldL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
438 when(newL3Ep.getTenant()).thenReturn(mock(TenantId.class));
439 when(newL3Ep.getEndpointGroup()).thenReturn(mock(EndpointGroupId.class));
440 when(newL3Ep.getL3Context()).thenReturn(mock(L3ContextId.class));
441 when(newL3Ep.getIpAddress()).thenReturn(mock(IpAddress.class));
443 OfOverlayL3Context ofOverlayL3Context = mock(OfOverlayL3Context.class);
444 when(newL3Ep.getAugmentation(OfOverlayL3Context.class)).thenReturn(ofOverlayL3Context);
446 when(newL3Ep.getNetworkContainment()).thenReturn(null);
448 when(newL3Ep.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
449 when(newL3Ep.getMacAddress()).thenReturn(mock(MacAddress.class));
450 when(newL3Ep.getIpAddress()).thenReturn(new IpAddress(new Ipv4Address("1.1.1.1")));
452 manager.processL3Endpoint(null, oldL3Ep);
453 manager.processL3Endpoint(oldL3Ep, newL3Ep);
455 verify(endpointListener).endpointUpdated(any(EpKey.class));
459 public void updateEndpointTestNewEndpointRemove() {
460 Collection<Endpoint> collection;
461 manager.processEndpoint(null, endpoint2);
462 verify(endpointListener).endpointUpdated(any(EpKey.class));
463 verify(endpointListener).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
464 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
465 assertFalse(collection.isEmpty());
467 manager.processEndpoint(endpoint2, null);
468 verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
469 verify(endpointListener, times(2)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
470 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
471 assertTrue(collection.isEmpty());
475 public void updateEndpointTestNewLocNullOldLocNullOfOverlayContextAugmentationNull() {
476 when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
477 when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
479 manager.processEndpoint(endpoint1, endpoint2);
480 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
481 verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
485 public void updateEndpointTestNewLocNullOldLocNull() {
486 when(context1.getNodeId()).thenReturn(null);
487 when(context2.getNodeId()).thenReturn(null);
489 manager.processEndpoint(endpoint1, endpoint2);
490 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
491 verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
495 public void updateEndpointTestNewLocNullOldLocNullExternalPut() {
496 when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
497 when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
499 manager.processEndpoint(endpoint1, endpoint2);
500 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
501 verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
505 public void updateEndpointTestNewLocNullOldLocNullExternalRemove() {
506 when(context1.getNodeId()).thenReturn(null);
507 manager.processEndpoint(null, endpoint1);
509 manager.processEndpoint(endpoint1, null);
510 verify(endpointListener, never()).endpointUpdated(any(EpKey.class));
511 verify(endpointListener, never()).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
515 * Endpoint changes it's location
518 public void updateEndpointLocationTestUpdate() {
519 Collection<Endpoint> collection;
520 manager.processEndpoint(null, endpoint1);
522 manager.processEndpoint(endpoint1, endpoint2);
523 verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
524 // create: node1, update: node1 -> node2
525 verify(endpointListener, times(3)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
526 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
527 assertFalse(collection.isEmpty());
531 * Endpoint changes it's EPG
534 public void updateEndpointGroupTestUpdate() {
535 Collection<Endpoint> collection;
536 EndpointGroupId otherEndpointGroupId = mock(EndpointGroupId.class);
537 when(endpoint2.getEndpointGroup()).thenReturn(otherEndpointGroupId);
538 when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(context1);
539 manager.processEndpoint(null, endpoint1);
541 manager.processEndpoint(endpoint1, endpoint2);
542 verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
543 verify(endpointListener, times(1)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
544 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
545 assertTrue(collection.isEmpty());
546 collection = manager.getEndpointsForGroup(new EgKey(tenantId, otherEndpointGroupId));
547 assertFalse(collection.isEmpty());
551 * Endpoint changes it's location and EPGs
554 public void updateEndpointLocationAndGroupTestUpdate() {
555 Collection<Endpoint> collection;
556 EndpointGroupId otherEndpointGroupId = mock(EndpointGroupId.class);
557 when(endpoint2.getEndpointGroup()).thenReturn(otherEndpointGroupId);
558 manager.processEndpoint(null, endpoint1);
560 manager.processEndpoint(endpoint1, endpoint2);
561 verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
562 // create: node1, update: node1 -> node2
563 verify(endpointListener, times(3)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
564 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
565 assertTrue(collection.isEmpty());
566 collection = manager.getEndpointsForGroup(new EgKey(tenantId, otherEndpointGroupId));
567 assertFalse(collection.isEmpty());
571 * Endpoint becomes external when removing it's location augmentation.
572 * This might happen when an endpoint is removed from a device.
575 public void updateEndpointLocationRemovedTestUpdate() {
576 Collection<Endpoint> collection;
577 when(endpoint2.getAugmentation(OfOverlayContext.class)).thenReturn(null);
578 manager.processEndpoint(null, endpoint1);
580 manager.processEndpoint(endpoint1, endpoint2);
581 verify(endpointListener, times(2)).endpointUpdated(any(EpKey.class));
582 verify(endpointListener, times(2)).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
583 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
584 assertTrue(collection.isEmpty());
588 * Endpoint is created when adding location augmentation.
589 * Endpoint is not external anymore.
592 public void updateEndpointLocationAddedTestUpdate() {
593 Collection<Endpoint> collection;
594 when(endpoint1.getAugmentation(OfOverlayContext.class)).thenReturn(null);
595 manager.processEndpoint(null, endpoint1);
597 manager.processEndpoint(endpoint1, endpoint2);
598 verify(endpointListener).endpointUpdated(any(EpKey.class));
599 verify(endpointListener).nodeEndpointUpdated(any(NodeId.class), any(EpKey.class));
600 collection = manager.getEndpointsForGroup(new EgKey(tenantId, endpointGroupId));
601 assertFalse(collection.isEmpty());
605 public void closeTest() throws Exception {
614 public void getEgKeyTest() {
615 assertNotNull(manager.getEgKey(endpoint1));
616 assertNull(manager.getEgKey(null));
618 when(endpoint1.getTenant()).thenReturn(null);
619 assertNull(manager.getEgKey(endpoint1));
621 when(endpoint1.getTenant()).thenReturn(tenantId);
622 when(endpoint1.getEndpointGroup()).thenReturn(null);
623 assertNull(manager.getEgKey(endpoint1));
625 when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
626 when(endpoint1.getEndpointGroups()).thenReturn(null);
627 assertNotNull(manager.getEgKey(endpoint1));
629 when(endpoint1.getEndpointGroup()).thenReturn(null);
630 assertNull(manager.getEgKey(endpoint1));
632 when(endpoint1.getEndpointGroup()).thenReturn(endpointGroupId);
633 when(endpoint1.getL2Context()).thenReturn(null);
634 assertNull(manager.getEgKey(endpoint1));
636 when(endpoint1.getL2Context()).thenReturn(l2BridgeDomainId);
637 when(endpoint1.getMacAddress()).thenReturn(null);
638 assertNull(manager.getEgKey(endpoint1));
642 public void getEgKeysForEndpointTest() {
643 Endpoint endpoint = mock(Endpoint.class);
646 when(endpoint.getEndpointGroups()).thenReturn(null);
647 egKeys = manager.getEgKeysForEndpoint(endpoint);
648 assertTrue(egKeys.isEmpty());
650 EndpointGroupId endpointGroupId = mock(EndpointGroupId.class);
651 when(endpoint.getEndpointGroup()).thenReturn(endpointGroupId);
652 egKeys = manager.getEgKeysForEndpoint(endpoint);
653 assertEquals(1, egKeys.size());
655 EndpointGroupId epgId = mock(EndpointGroupId.class);
656 List<EndpointGroupId> endpointGroups = Collections.singletonList(epgId);
657 when(endpoint.getEndpointGroups()).thenReturn(endpointGroups);
658 egKeys = manager.getEgKeysForEndpoint(endpoint);
659 assertEquals(2, egKeys.size());
663 public void isExternalIsInternalTest() {
664 Endpoint endpoint = mock(Endpoint.class);
665 when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(null);
667 // assertFalse(manager.isExternal(endpoint));
668 // assertTrue(manager.isInternal(endpoint));
670 // OfOverlayContext ofc = mock(OfOverlayContext.class);
671 // when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofc);
672 // when(ofc.getLocationType()).thenReturn(null);
673 // assertFalse(manager.isExternal(endpoint));
674 // assertTrue(manager.isInternal(endpoint));
676 // when(ofc.getLocationType()).thenReturn(LocationType.Internal);
677 // assertFalse(manager.isExternal(endpoint));
678 // assertTrue(manager.isInternal(endpoint));
680 // when(ofc.getLocationType()).thenReturn(LocationType.External);
681 // assertTrue(manager.isExternal(endpoint));
682 // assertFalse(manager.isInternal(endpoint));
686 public void testGetL2EndpointFromL3() {
687 when(newL3Ep.getL2Context()).thenReturn(mock(L2BridgeDomainId.class));
688 when(newL3Ep.getMacAddress()).thenReturn(mock(MacAddress.class));
690 Endpoint ep = manager.getL2EndpointFromL3(newL3Ep);
696 public void testGetL2EndpointFromL3_noL2Context_noMacAddr() {
697 when(newL3Ep.getL2Context()).thenReturn(null);
698 when(newL3Ep.getMacAddress()).thenReturn(null);
700 Endpoint ep = manager.getL2EndpointFromL3(newL3Ep);