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.mapper.external;
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.times;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
22 import org.opendaylight.groupbasedpolicy.dto.PolicyInfo;
23 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockOfContext;
24 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager;
25 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
26 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
27 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager;
28 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
29 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.MockEndpointManager;
30 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.MapperUtilsTest;
31 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.MockSwitchManager;
32 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddressBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ForwardingContextBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
51 import org.powermock.api.mockito.PowerMockito;
52 import org.powermock.core.classloader.annotations.PrepareForTest;
53 import org.powermock.modules.junit4.PowerMockRunner;
55 import com.google.common.collect.ImmutableSet;
57 import java.util.Collection;
58 import java.util.HashSet;
61 @RunWith(PowerMockRunner.class)
62 @PrepareForTest({PolicyManager.class})
63 public class ExternalMapperTest extends MapperUtilsTest {
65 private ExternalMapper mapper;
67 private short tableId;
68 private Ipv4Address natAddr = new Ipv4Address("192.168.111.52");
72 public void initialisation() {
73 PowerMockito.stub(PowerMockito.method(PolicyManager.class, "setSfcTableOffset")).toReturn(true);
75 endpointManager = mock(EndpointManager.class);
76 policyManager = mock(PolicyManager.class);
77 switchManager = mock(SwitchManager.class);
78 policyInfo = mock(PolicyInfo.class);
79 ctx = mock(OfContext.class);
81 ofWriter = mock(OfWriter.class);
82 mapper = new ExternalMapper(ctx, tableId);
86 public void constructorTest() {
87 Assert.assertEquals(tableId, mapper.getTableId());
91 public void testSync() throws Exception {
93 Set<Long> externalPorts = new HashSet<>();
94 externalPorts.add(Long.valueOf(CONNECTOR_1.getValue()));
96 TenantBuilder tenantBuilder = buildTenant();
97 tenantBuilder.setForwardingContext(new ForwardingContextBuilder()
98 .setL2FloodDomain(getL2FloodDomainList(true))
99 .setL2BridgeDomain(getL2BridgeDomainList())
100 .setL3Context(getL3ContextList())
101 .setSubnet(getSubnetList()).build())
103 Tenant tenant = tenantBuilder.build();
105 EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0)
106 .setL2Context(L2BD_ID);
107 // L3 Endpoint with Nat
108 EndpointL3Builder endpointL3Builder = buildL3Endpoint(natAddr, IPV4_1, MAC_0, null)
109 .setL2Context(L2BD_ID);
110 endpointL3Builder.setTenant(tenant.getId());
111 Collection<EndpointL3> l3EndpointsWithNat = new HashSet<>();
112 l3EndpointsWithNat.add(endpointL3Builder.build());
114 when(ctx.getTenant(any(TenantId.class))).thenReturn(new IndexedTenant(tenant));
115 when(ctx.getEndpointManager()).thenReturn(endpointManager);
116 when(ctx.getSwitchManager()).thenReturn(switchManager);
117 when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
118 when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID);
119 when(endpointManager.getL3EndpointsWithNat()).thenReturn(l3EndpointsWithNat);
120 when(switchManager.getExternalPortNumbers(any(NodeId.class))).thenReturn(externalPorts);
122 mapper.sync(endpointBuilder.build(), ofWriter);
124 verify(ofWriter, times(3)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
128 public void testSync_NoExternalPorts() throws Exception {
129 // we still need ExternalMapper flows (default output and default drop) to be generated
130 EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0);
132 when(ctx.getEndpointManager()).thenReturn(endpointManager);
133 when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
134 when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
135 when(ctx.getSwitchManager()).thenReturn(switchManager);
136 when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID);
138 mapper.sync(endpointBuilder.build(), ofWriter);
139 verify(ofWriter, times(2)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));